log4net为每次调用log.info写入单个文件

时间:2014-05-13 12:52:52

标签: c# asp.net .net log4net

我一直在使用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文件(下面)中创建了一个新的appender并在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文档的文件名,以便我可以将其作为堆栈跟踪的补充附加到实际的日志文件中。

1 个答案:

答案 0 :(得分:0)

如果您使用基本的FileAppender或其衍生产品,那么您运气不佳;只要在ActivateOptions()方法中初始化appender,就会创建该文件。从我看到你需要一个自定义FileAppender来处理你所有的业务规则。它需要

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

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