Log4net在不丢错方面有点擅长。我试图创建某种处理程序,如果log4net无法启动或死亡,并且无法再记录,则会触发。
我知道应用程序设置键可以打开log4net的内部调试(log4net.Internal.Debug)。我不需要所有的调试信息,只要log4net存在问题。
有没有人有办法以编程方式捕获和处理log4net中的错误?
答案 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小时/天未进行任何更改时提醒您。