Log4net在设计上无声地失败。好。我不想让它取下我的应用程序。
当Log4net崩溃并停止记录时,有没有办法设置通知?
是否有一些我可以挂钩的事件处理程序会告诉我Log4net已经沉默了?
我想知道这种情况何时发生,以便我尽快回收应用池。
谢谢!
答案 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中有关自定义跟踪侦听器的内容,以便从一个事件触发事件。