在自定义的log4net appender内部实现日志记录/错误处理

6
我们有一个内部开发的日志系统,希望能够使用log4net的多个附加器同时记录日志。我们决定将旧的日志系统移植到自定义的log4net appender中。当旧系统正确配置时,这种方法非常有效,但是旧的logger实际上将日志写入WCF客户端(使得对于冗长的日志记录变得缓慢,这也是我们想要使用其他log4net appenders的原因),最近WCF配置并不是完全正确的。当出现这种情况时,应用程序似乎运行良好,但显然旧系统的自定义appender没有工作。其他appenders正常工作,但是没有从自定义旧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事件日志那样去做?显然存在无限递归下降的巨大危险,但我认为有一些方法可以让操作员知道其中一个appenders未能运行。
JR
2个回答

4

当然,我刚刚发布问题后就想起了一些东西。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

0
请确保在代码的开头有以下一行: using System.Threading;

我忘记了原问题是什么,但我的观点是关于如何使自定义log4net appender在运行时记录到log4net机制中。据我所知,“using”语句只会在编译时修复问题。事实上,我根本没有编译问题。我需要查看在运行时出了什么问题。 - jrv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接