Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# log4net为每次对log.info的调用编写一个文件_C#_Asp.net_.net_Log4net - Fatal编程技术网

C# log4net为每次对log.info的调用编写一个文件

C# log4net为每次对log.info的调用编写一个文件,c#,asp.net,.net,log4net,C#,Asp.net,.net,Log4net,我一直在使用log4net来捕获在我的应用程序运行期间发生的任何异常,这些异常工作得很好,然后我创建了自己的静态方法,该方法负责捕获失败的XML对象,该对象旨在提供进一步的读取以补充日志条目 public static void WriteReceiptToXml(Exception ex, string XmlReceipt) { if (XmlReceipt != null) { string filename = ConfigurationManager.A

我一直在使用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,并在信息级别对其进行了过滤,然后我意识到,只要我运行应用程序,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文档的文件名,以便将其附加到实际日志文件中,作为堆栈跟踪的补充

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

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

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

FileAppender+MinimalLock
应该只在需要的时候打开文件进行写入。是的,我认为这是正确的,但我可以看到,只要应用程序运行,无论出现错误时,我希望只有在执行catch块时才能创建空XML。这个问题似乎支持了我的观点,即我不应该使用log4net来执行此操作,因为从技术上讲,我不是“记录”XML文件,而是将其保存为补充: