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

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

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

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

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

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

可能对您有用的是创建一个为每个appender实现IErrorHandler的类,然后配置每个appender以使用自定义error handling类。 这应该比启用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(); 

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

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

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