2008-12-06 50 views
2

我正在創建一個Windows服務。發生異常時,我會適當處理並創建日誌。我正在使用decorator pattern,因爲人們會看到這些日誌的方式有很多種。我有一個電子郵件記錄器,一個文件記錄器和一個Windows事件記錄器,所有這些都從實現ILogger的LoggingDecorator繼承而來。所以,沒有記錄器知道任何其他記錄器。c#windows-services - 如何處理日誌記錄異常?

我的問題是:我應該如何處理日誌異常?

如果寫入文件失敗或發送電子郵件失敗,我該怎麼辦?我想記錄與其他記錄器的初始日誌內容,但我如何處理日誌記錄異常?它是否也取決於構造函數中記錄器的順序?

現在,我只是用空catch(Exception)語句包裝try/catch塊,它們只是感覺很髒,並且使得FxCop對我大叫。但是,這是"it depends"時刻之一嗎?

[Flags] 
public enum LoggingCategories 
{ 
    None = 0, 
    ServiceEvents = 1, 
    ProcessingInformation = 2, 
    ProcessingErrors = 4, 
    UnexpectedErrors = 8 
} 

public interface ILogger 
{ 
    void LogMessage(LoggingCategories category, string message); 
} 

public abstract class LoggerDecorator : ILogger 
{ 
    private ILogger _decoratedLogger; 
    private LoggingCategories _categories; 

    protected LoggerDecorator(ILogger logger, LoggingCategories categories) 
    { 
     this._decoratedLogger = logger; 
     this._categories = categories; 
    } 

    protected bool ShouldLogCategory(LoggingCategories category) 
    { 
     return ((this._categories & category) == category); 
    } 

    public virtual void LogMessage(LoggingCategories category, string message) 
    { 
     _decoratedLogger.LogMessage(category, message); 
    } 

} 

public class ControlLogger : ILogger 
{ 
    public ControlLogger() 
    { 
    } 

    public void LogMessage(LoggingCategories category, string message) 
    { 
     Console.WriteLine(LoggingHelper.ConstructLog(category, message)); 
    } 
} 

(在WindowsEventLogger可疑代碼)

try 
{ 
    this._eventLog.WriteEntry(log, type); 
} 
catch (Exception) 
{ 
    //Even if this logging fails, we do not want to halt any further logging/processing. 
} 

(服務構造函數代碼)

ILogger controlLogger = new ControlLogger(); 
ILogger windowsEventLogger = new WindowsEventLogger(controlLogger, windowsEventLogCategories, windowsEventLogSource); 
ILogger emailLogger = new EmailLogger(windowsEventLogger, emailCategories, emailSubject, emailAddresses); 
ILogger fileLogger = new FileLogger(emailLogger, fileCategories, logDirectory, logFileNamePrefix, logFileExtension); 

this._logger = fileLogger; 

回答

1

它不是一個答案,但很好奇你爲什麼選擇不使用現有的System.Diagnostics.Trace方法。你可以在它上面實現某種類型的日誌類型分類嗎?

6

爲什麼不把它在實際的Windows事件記錄是否登錄失敗?

+1

安靜的你!我們不會容忍這裏的常識! +1 – 2008-12-06 01:55:57

0

在您信任的非常可靠的表現良好的機器上創建單獨的ping服務。如果您的主服務失敗,則ping也會失敗,並且控制服務會向您發送包含警告的電子郵件。