【问题标题】:c# windows-services - How do I handle logging exceptions?c# windows-services - 如何处理日志记录异常?
【发布时间】:2010-09-25 15:07:33
【问题描述】:

我正在创建 Windows 服务。当发生异常时,我会适当地处理它并创建一个日志。我正在使用decorator pattern,因为人们查看这些日志的方式有很多种。我有一个电子邮件记录器、一个文件记录器和一个 Windows 事件记录器,它们都继承自实现 ILogger 的 LoggingDecorator。因此,没有记录器知道任何其他记录器。

我的问题是:我应该如何处理日志记录异常?

如果写入文件失败,或发送电子邮件失败,我该怎么办?我想用其他记录器记录初始日志内容,但是如何处理记录异常?不也取决于构造函数中记录器的顺序吗?

现在,我只是用空的 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;

【问题讨论】:

    标签: c# exception logging windows-services decorator


    【解决方案1】:

    如果记录器失败,为什么不把它放在实际的 Windows 事件日志中?

    【讨论】:

    • 让你安静!我们不会在这里容忍常识! +1
    【解决方案2】:

    这不是一个答案,但很好奇您为什么选择不使用现有的 System.Diagnostics.Trace 方法。您或许可以在它之上实现某种类型的日志类型分类?

    【讨论】:

      【解决方案3】:

      在您认为非常可靠的性能良好的机器上创建单独的 ping 服务。如果您的主要服务失败,那么 ping 也会失败,并且控制服务应该向您发送带有警告的电子邮件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 2020-10-01
        • 2014-10-28
        相关资源
        最近更新 更多