崩溃时可以设置Log4net通知吗?

时间:2015-06-16 03:27:11

标签: log4net

Log4net在设计上无声地失败。好。我不想让它取下我的应用程序。

当Log4net崩溃并停止记录时,有没有办法设置通知?

是否有一些我可以挂钩的事件处理程序会告诉我Log4net已经沉默了?

我想知道这种情况何时发生,以便我尽快回收应用池。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果我正确理解你,你会希望log4net在appender失败时向你发出信号。如果我们查看Logger实现的日志代码,我们会发现考虑到appender失败的唯一一点是内部日志记录机制:

// log4net.Repository.Hierarchy.Logger
public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception)
{
    try
    {
        if (this.IsEnabledFor(level))
        {
            this.ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : Logger.ThisDeclaringType, level, message, exception);
        }
    }
    catch (Exception exception2)
    {
        LogLog.Error("Log: Exception while logging", exception2);
    }
    catch
    {
        LogLog.Error("Log: Exception while logging");
    }
}

当然,只有在appender抛出异常时才会发生这种情况。然后,LogLog组件将消息转发到控制台和跟踪组件:

// log4net.Util.LogLog
private static void EmitErrorLine(string message)
{
    try
    {
        Console.Error.WriteLine(message);
        Trace.WriteLine(message);
    }
    catch
    {
    }
}

因此,通过侦听来自跟踪的消息,您可以了解您的appender中发生的情况。要将此转换为事件,您可以添加在某些特定情况下触发的跟踪侦听器:您可以查看this answer中有关自定义跟踪侦听器的内容,以便从一个事件触发事件。