【问题标题】:log4net write single file for each call to log.infolog4net 为每次调用 log.info 写入单个文件
【发布时间】:2014-05-13 12:52:51
【问题描述】:

我一直在使用 log4net 来捕获在我的应用程序运行期间发生的任何异常,它运行良好,然后我创建了自己的静态方法,该方法负责捕获失败的 XML 对象,该对象旨在提供进一步阅读以补充日志条目。

public static void WriteReceiptToXml(Exception ex, string XmlReceipt)
{
    if (XmlReceipt != null)
    {
        string filename = ConfigurationManager.AppSettings["XmlReceiptPath"] + "/ReceiptXml" + DateTime.Now.ToString("ddMMyyhhmmss") + ".xml";
        File.WriteAllText(filename, XmlReceipt);
        Logger.Error(string.Format("The Xml Receipt was written to {0}", filename));
    }

    else
        Logger.Error("The Xml Receipt was empty so no document was created. Please reference the Payment request XML");
}

效果很好,但是一位更有经验的同事建议这有点代码味道,我实际上是在重新发明轮子,因为我已经在使用 log4net,所以应该处理这个任务也靠它。

此时,我在 Web.config 文件(如下)中创建了一个新的附加程序,并在 INFO 级别对其进行了过滤,然后我意识到,只要我运行应用程序,log4net 就会创建 XML 文件,而不管catch 块是否捕获到异常,如果没有发生错误则将其留空,这显然不是我想要的。

<appender name="ReceiptXmlAppender" type="log4net.Appender.FileAppender" >
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <file type="log4net.Util.PatternString" value="App_Data/ReceiptXml/Receipt-%date{yyyy-MM-dd_HH-mm-ss}.xml"/>
  <appendToFile value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%m" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <param name="LevelMin" value="INFO"/>
    <param name="LevelMax" value="INFO"/>
  </filter>
</appender>

总之我想要的是:

  • log4net 仅在我的 catch 块中调用 INFO 方法时创建 XML
  • 每次调用 LOG.INFO 时都会创建 1 个文件
  • 文件必须带有日期时间戳
  • 我需要知道创建的 XML 文档的文件名,以便将其附加到实际日志文件中,作为堆栈跟踪的补充。

【问题讨论】:

  • FileAppender+MinimalLock 应该只在需要时打开要写入的文件。
  • 是的,我是这么想的,但是无论是否发生错误,只要应用程序运行,我就可以看到文件已创建,然后当我希望仅创建此文件时,我只剩下空 XML当 catch 块执行时。
  • 这个问题似乎支持了我的观点,即我不应该使用 log4net 来执行此操作,因为我在技术上不是“记录”XML 文件,而是将其保存为补充:stackoverflow.com/questions/2533403/…

标签: c# asp.net .net log4net


【解决方案1】:

如果您使用基本的FileAppender 或其派生词之一,那么您就不走运了;只要在 ActivateOptions() 方法中初始化 appender,就会创建该文件。据我所知,您需要一个自定义 FileAppender 来处理您的所有业务规则。它需要

  • 覆盖默认的ActivateOptions 方法以防止创建文件
  • 覆盖Append 方法以在记录消息时创建新的时间戳文件
  • 使用LoggingEvent 类中传递的数据(您在该类中有一些可用的属性)来检索文件名;您必须在记录之前确定文件名。

除非您想从它已经实现的行为(例如模拟)中受益,否则我建议跳过从 FileAppender 类继承并直接从 TextWriterAppender 类继承。

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多