2009-08-06 70 views
3

Log4net在不丢出错误方面有点太好了。我试图创建一些处理程序,如果log4net无法启动或死亡并且无法再登录,则会触发该处理程序。如何在log4net停止记录时接收事件

我知道应用程序设置键打开log4net的内部调试(log4net.Internal.Debug)。尽管如此,我并不需要所有的调试信息,只要log4net出现问题。

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

回答

0

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

这是值得尝试的非常简单的模式布局,有时它是在模式布局中使用%P {XYZ}元素,如果相应的属性设置不正确,会导致问题。如果所有事情都按照预期以简单的模式布局运行,那么您可以逐个添加所需的内容,然后查看是否可以通过这种方式查明问题所在。

+2

这似乎是正确的。在我们需要它的几次时间里,我们一直在打开log4net.Internal.Debug。 – 2009-10-21 20:36:18

4

某些可能适用于您的东西是创建一个为每个appender实现IErrorHandler的类,然后将每个appender配置为使用自定义错误处理类。这应该给你更多的控制,而不是启用log4net.Internal.Debug。

我刚刚给这是一个尝试,它工作(注意,我的样本Logger中是别处定义的log4net的记录 - 这背后的目的是从一个SMTP附加器捕获错误,并将它们记录到文件中):

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(); 
0

我们建立了执行Logger.Log.Error自己的自定义类......如果一个抛出异常或出错,我们编写原始错误和al所以异常进入Windows事件日志。

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

0

如果您使用诸如SCOM(系统中心操作管理器)之类的监视工具,可以将其设置为监视日志文件,并在超过n小时/天未做任何更改时提醒您。