【问题标题】:Possible to set up Log4net Notification When it Crashes?崩溃时可以设置 Log4net 通知吗?
【发布时间】:2015-06-16 03:27:11
【问题描述】:

Log4net 设计为静默失败。好的。我不希望它关闭我的应用程序。

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

是否有某种我可以挂钩的事件处理程序会告诉我 Log4net 已静音?

我想知道什么时候会发生这种情况,以便尽快回收应用程序池。

谢谢!

【问题讨论】:

  • 不,您必须自己使用某种心跳记录来实现这一点。就我个人而言,我在使用它多年以来从未见过 log4net 崩溃 - 我见过它无法启动并且我见过它断开数据库连接(这就是为什么有 ReconnectOnError),但从来没有这样失败过。跨度>
  • @stuartd 感谢您的信息。我什至不知道 ReconnectOnError。

标签: log4net


【解决方案1】:

如果我对您的理解正确,您希望 log4net 在附加程序失败时向您发出信号。如果我们查看 Logger 实现的日志代码,我们会发现唯一考虑到 appenders 失败的是内部日志机制:

// 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
    {
    }
}

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

【讨论】:

  • 谢谢。我们看到 Log4net 以合理的规律性停止记录。我们还没有确定它是否仅限于 ADO appender。那应该是第 1 步,因为我们最近也有一个文件附加程序。您的跟踪建议看起来是个好主意,我们将对其进行研究。谢谢。
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多