如果log4net停止记录,如何接收事件

时间:2009-08-06 14:54:48

标签: c# log4net

Log4net在不丢错方面有点擅长。我试图创建某种处理程序,如果log4net无法启动或死亡,并且无法再记录,则会触发。

我知道应用程序设置键可以打开log4net的内部调试(log4net.Internal.Debug)。我不需要所有的调试信息,只要log4net存在问题。

有没有人有办法以编程方式捕获和处理log4net中的错误?

4 个答案:

答案 0 :(得分:4)

可能对您有用的是创建一个为每个appender实现IErrorHandler的类,然后配置每个appender以使用自定义错误处理类。这应该比启用log4net.Internal.Debug。

给你更多的控制权

我刚试了一下这是有效的(请注意,在我的示例Logger中是一个在别处定义的log4net记录器 - 这背后的目的是从SMTP appender捕获错误并将它们记录到文件中):

using System;

using log4net.Core;

namespace Test
{
    public class SmtpErrorHandler : IErrorHandler
    {
        public void Error(string message)
        {
            Logger.Log.Error(message);
        }

        public void Error(string message, Exception ex)
        {
            Logger.Log.Error(message, ex);
        }

        public void Error(string message, Exception ex, ErrorCode errorCode)
        {
            Logger.Log.Error(String.Format("{0}{1}Error code: {2}", message, Environment.NewLine, errorCode), ex);
        }
    }
}

我配置我的appender(当然你也可以在配置中这样做):

emailAppender.ErrorHandler = new SmtpErrorHandler();

答案 1 :(得分:0)

好吧,log4net会让你很难做到这一点,因为它会(按设计)抑制日志记录操作期间抛出的异常。这是因为格式化日志消息时生产系统不会因为错误而失败。

使用非常简单的图案布局值得尝试,因为有时在图案布局中使用%P {XYZ}元素会导致问题,如果没有正确设置相应的属性。如果所有内容都按照预期的方式使用简单的模式布局,您可以一次一个地添加所需的内容,看看是否可以通过这种方式查明问题。

答案 2 :(得分:0)

我们创建了自己的自定义类,它执行Logger.Log.Error ...如果抛出异常或出现问题,我们会将原始错误和异常写入Windows事件日志。

在分析错误时,用户不仅要向我们发送日志文件,还要向我们发送事件日志。我们创建了一个工具,可以自动导出事件日志并将它们与所有可用的Log4net日志文件一起压缩成zip文件。

答案 3 :(得分:0)

如果您使用SCOM(System Center Operations Manager)等监视工具,则可以将其设置为监视日志文件,并在超过n小时/天未进行任何更改时提醒您。