自定义log4net appender中的日志记录/错误处理

时间:2015-10-21 13:49:36

标签: log4net log4net-appender

我们有一个内部开发的日志系统,我们希望获得log4net的好处,例如能够同时使用多个appender。我们决定将旧的日志记录系统转移到自定义的log4net appender中。当遗留系统配置正确时,这很有效,但遗留记录器实际上写入了WCF客户端(使得详细日志记录变慢,我们想要使用其他log4net appender的原因),最近WCF配置不是很好本来应该。当发生这种情况时,应用程序似乎运行正常,但显然遗留系统的自定义appender无法正常工作。其他appender工作正常,但自定义旧版appender没有输出,也没有错误消息表明存在问题。

处理“递归”日志记录的正确方法是什么,即从自定义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事件日志的操作?显然存在无限递归下降的巨大危险,但我认为会有一些方法让操作员知道其中一个appender无法运行。

JR

2 个答案:

答案 0 :(得分:3)

当然,一旦我发布了这个问题,我就会想起一些事情。 log4net在appSettings中有一个调试开关。我用了这段代码:

this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex);

在catch块内,然后设置魔术设置:

<appSettings>
    <!--this is wonderful magic-->
    <add key="log4net.Internal.Debug" value="true" />
</appSettings>

现在ConsoleAppender(我正在使用的另一个appender)发出了自定义appender异常消息。

JR

答案 1 :(得分:0)

确保此行在顶部: 使用System.Threading;