我正在創建一個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 – 2008-12-06 01:55:57