logging/error 在自定义 log4net appender 中处理

logging/error handling inside a custom log4net appender

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

处理 "recursive" 日志记录的正确方法是什么,即从自定义 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: Recursive read lock acquisitions not allowed in this mode."很公平;这是天真的解决方案。

我也试过:

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

在异常处理程序中,因为它看起来可能是正确的。没有明显的事情发生。

有没有办法通过 appender 中的 log4net 记录错误?或者我是否必须直接对 windows 事件日志进行硬编码?显然存在无限递归下降的巨大危险,但我认为会有某种方法让操作员知道其中一个附加程序未能 运行.

JR

当然一发题我就想起了什么。 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(我使用的另一个附加程序)发出自定义附加程序异常消息。

JR

确保你在顶部有这一行: 使用 System.Threading;