我们有一个内部开发的日志系统,希望能够使用log4net的多个附加器同时记录日志。我们决定将旧的日志系统移植到自定义的log4net appender中。当旧系统正确配置时,这种方法非常有效,但是旧的logger实际上将日志写入WCF客户端(使得对于冗长的日志记录变得缓慢,这也是我们想要使用其他log4net appenders的原因),最近WCF配置并不是完全正确的。当出现这种情况时,应用程序似乎运行良好,但显然旧系统的自定义appender没有工作。其他appenders正常工作,但是没有从自定义旧appender输出任何内容,并且没有错误消息表明存在问题。
如何处理“递归”日志记录的正确方法,即从自定义的log4net appender内部记录日志?我尝试了一种简单的解决方案:从静态对象中获取log4net并在appender内部记录日志:
在异常处理程序中,我认为这可能是正确的事情,但并没有发生明显的变化。
在一个appender中是否有一种通过log4net记录错误的方法?还是说我必须像硬编码直接写入Windows事件日志那样去做?显然存在无限递归下降的巨大危险,但我认为有一些方法可以让操作员知道其中一个appenders未能运行。
JR
如何处理“递归”日志记录的正确方法,即从自定义的log4net appender内部记录日志?我尝试了一种简单的解决方案:从静态对象中获取log4net并在appender内部记录日志:
public class MyCustomAppender : AppenderSkeleton
{
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
try
{
// something which throws here...
}
catch (Exception ex)
{
log4net.LogManager.GetLogger(this.GetType()).Error(this.GetType().ToString() + ": error during append", ex);
}
}
}
这是一个彻底的失败,"System.Threading.LockRecursionException:在此模式下不允许递归读锁获取。"好吧,那是一个天真的解决方案。
我还尝试了:
this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex);
在异常处理程序中,我认为这可能是正确的事情,但并没有发生明显的变化。
在一个appender中是否有一种通过log4net记录错误的方法?还是说我必须像硬编码直接写入Windows事件日志那样去做?显然存在无限递归下降的巨大危险,但我认为有一些方法可以让操作员知道其中一个appenders未能运行。
JR