可以在崩溃时设置 Log4net 通知吗?
Possible to set up Log4net Notification When it Crashes?
Log4net 设计为静默失败。好的。我不希望它关闭我的应用程序。
有没有办法在 Log4net 崩溃并停止记录时设置通知?
是否有某种我可以挂接的事件处理程序会告诉我 Log4net 已停止运行?
我想知道这种情况何时发生,以便我尽快回收应用程序池。
谢谢!
如果我对您的理解正确,您希望 log4net 在 appender 失败时向您发出信号。如果我们查看 Logger 实现的日志记录代码,我们会发现唯一考虑到附加程序失败的点是内部日志记录机制:
// 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
组件然后将消息转发到 Console 和 Trace 组件:
// log4net.Util.LogLog
private static void EmitErrorLine(string message)
{
try
{
Console.Error.WriteLine(message);
Trace.WriteLine(message);
}
catch
{
}
}
因此,通过监听来自跟踪的消息,您可以了解您的 appender 中发生了什么。要将其变成一个事件,您可以添加一个在某些特定情况下触发的跟踪侦听器:您可以查看 this answer 中有关自定义跟踪侦听器的内容,以便从一个侦听器中触发事件。
Log4net 设计为静默失败。好的。我不希望它关闭我的应用程序。
有没有办法在 Log4net 崩溃并停止记录时设置通知?
是否有某种我可以挂接的事件处理程序会告诉我 Log4net 已停止运行?
我想知道这种情况何时发生,以便我尽快回收应用程序池。
谢谢!
如果我对您的理解正确,您希望 log4net 在 appender 失败时向您发出信号。如果我们查看 Logger 实现的日志记录代码,我们会发现唯一考虑到附加程序失败的点是内部日志记录机制:
// 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
组件然后将消息转发到 Console 和 Trace 组件:
// log4net.Util.LogLog
private static void EmitErrorLine(string message)
{
try
{
Console.Error.WriteLine(message);
Trace.WriteLine(message);
}
catch
{
}
}
因此,通过监听来自跟踪的消息,您可以了解您的 appender 中发生了什么。要将其变成一个事件,您可以添加一个在某些特定情况下触发的跟踪侦听器:您可以查看 this answer 中有关自定义跟踪侦听器的内容,以便从一个侦听器中触发事件。