无法将数据从多个实例记录到单独的日志文件中

时间:2012-12-11 19:58:52

标签: log4net log4net-appender log4net-configuration

在我通常的日志记录体验中,我只是通过使用ILog之类的东西在每个类中创建一个mylog = LogManager.GetLogger( name)实例,这为每个实例提供了一个唯一的Logger。一切都记录到同一个文件,效果很好。

然而,现在我遇到了一个我想要登录两个单独文件的情况。我用以下logging.xml完成​​了这个:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO"/>
      <param name="LevelMax" value="FATAL"/>
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <!-- Pattern to output the caller's file name and line number -->
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="File" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="%property{LogName}" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="File" />
  </root>
</log4net>

在后面的代码中,我通过给它一个唯一的名称在每个实例的基础上设置FileAppender的名称:

log4net.GlobalContext.Properties["LogName"] = unique_path_here;

如果我实例化一个名为&#34; test1&#34;的对象,那么&#34; test1.log&#34;文件已创建。当我实例化另一个名为&#34; test2&#34;的对象时,&#34; test2.log&#34;文件已创建。在我开始在每个对象中调用方法之前,一切似乎都很有效。当我交替调用时,首先将一个对象的数据写入另一个对象的文件,然后将数据记录到正确的文件中。例如,以下是发生的事情的简化示例:

  1. test1.log() - &gt;写入test1.log
  2. test2.log() - &gt;写入test2.log
  3. test1.log() - &gt;将一行写入test2.log,然后将其余内容写入test1.log
  4. test2.log() - &gt;将一个lint写入test1.log,然后将其余内容写入test2.log
  5. 如果我并行运行这两个方法,所有行都会写入一个文件或另一个文件。然后真正奇怪的是,另一个最常用的文件从未再次写入!

    我不知道下一步该去哪儿。如果我通过GetLogger创建了一个Logger实例并向它传递了一个唯一的名称,并且这是一个私有成员变量,它怎么可能开始写入错误的文件?

1 个答案:

答案 0 :(得分:0)

现在看来很明显“GlobalContext”对类名可疑。 :)我将调查一下,看看问题是该属性是否在所有Logger实例中共享,如果是,是否有另一种方法来设置特定日志实例的日志名称。

编辑 - 好吧,那不是它。我用<File value="TEMP" />替换了logging.xml中的属性,然后在代码后面,我加载了FileAppender并将其File属性设置为正确的路径。行为是一样的。 :(

编辑 - 解决方案是为每个实例创建一个FileAppender,而不是每个实例创建一个Logger。我不确定为什么花了这么长时间才能得出这个结论,但我最终做了,现在看起来它正在发挥作用。