【问题标题】:Log4Net Stops loggingLog4Net 停止记录
【发布时间】:2012-06-20 14:10:24
【问题描述】:

我有一个全天运行的实用程序,用于数据转换和同步。

如果应用程序暂时停止运行,这没什么大不了的,但它必须记录它的操作。我宁愿应用程序失败也不愿让它不记录。我遇到了一些涉及该主题的帖子,但我无法获得任何解决方案。

我需要设置一种方法来阻止应用程序运行(取决于应用程序设置)并在 Log4Net 停止记录时发送警告电子邮件。

我的 appender 有这个:

<log4net>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
  <errorHandler type="SomeApp.PresentationLayer.Log4NetErrorHandler" />
  <file type="log4net.Util.PatternString" value="H:\SomeApp-%property{RegNo}-log.txt" />
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <header value="[START]" />
    <footer value="[END]" />
    <conversionPattern value="%date %-5level - %message%newline" />
  </layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
  <level value="DEBUG" />
  <appender-ref ref="LogFileAppender" />
  <!-- <appender-ref ref="A" /> -->
</root>

这是我的错误处理程序:

namespace SomeApp.PresentationLayer
{
class Log4NetErrorHandler : IErrorHandler
{

    public bool HandleError(Exception ex)
    {
        //Trace.TraceError(ex.ToString());
        ExceptionUtil.GetAndLogMessage(ex, "Log4Net Error in SomeApp", false, true);

        return false;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        // Shield the unknown exception
        FaultException faultException = new FaultException(
            "Server error encountered. All details have been logged.");
        MessageFault messageFault = faultException.CreateMessageFault();

        fault = Message.CreateMessage(version, messageFault, faultException.Action);
    }
}
}

无论我尝试什么,异常处理程序都不会触发。我将日志文件设置为映射驱动器。当它正在记录时,我断开了驱动器,它永远不会向我的异常处理程序抛出异常。有人看到我错过了什么吗?

我正在使用 c# .net 3.5 log4net 1.2.10

提前感谢您的帮助。

【问题讨论】:

    标签: .net exception-handling c#-3.0 log4net


    【解决方案1】:

    我实际上没有使用过 log4net errorHandlers 并且可能在这里完全关闭,但我的直觉告诉我 errorHandler 是为了配置 log4net 异常的处理,而不是应用程序异常,关于这个主题的可用信息非常少一篇关于 errorHandler 参数的虚假博文可能会让您感到困惑。来自 SDK 文档:

    Implements log4net's default error handling policy which consists of emitting a 
    message for the first error in an appender and ignoring all subsequent errors. 
    

    我承认不是很有帮助,但它似乎并没有像你想的那样。 您必须正确处理应用程序中的应用程序异常并自己记录消息才能在日志中看到它。

    还有another question here 可能会提供额外的线索。

    【讨论】:

    • 是的,这就是我想要的。我想处理 Log4net 中的错误,而不是我的应用程序中的错误。 Log4Net 以在遇到错误时不会崩溃应用程序而闻名。问题是,我仍然需要使用 Log4Net,但如果它停止记录,我想要错误。它的默认模式是完全静默停止记录。根本没有通知。
    • 我简直不敢相信我错过了解决方案。我混淆了 log4net.Core.IErrorHandler 和 .net IErrorHandler。我应该从签名中意识到这一点。谢谢你的链接。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2011-01-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
      相关资源
      最近更新 更多