2

在我通常的日志记录经验中,我只是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;

如果我实例化一个名为“test1”的对象,则会创建“test1.log”文件。当我实例化另一个名为“test2”的对象时,会创建“test2.log”文件。一切似乎都很好,直到我开始调用每个对象中的方法。当我交替调用时,一个对象的数据首先被写入另一个对象的文件,但随后数据被记录到正确的文件中。例如,这是一个简单的例子:

  1. test1.log() -> 写入 test1.log
  2. test2.log() -> 写入 test2.log
  3. test1.log() -> 写一行到 test2.log,然后剩下的写到 test1.log
  4. test2.log() -> 将 lint 写入 test1.log,然后将其余部分写入 test2.log

如果我并行运行这两种方法,所有行都会写入一个文件或另一个文件。那么真正奇怪的是,另一个最常用的文件再也没有被写入!

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

4

1 回答 1

0

当然,现在“GlobalContext”对于类名是可疑的,这似乎很明显。:) 我将对此进行调查,看看问题是否在于该属性在所有 Logger 实例之间共享,如果是,是否有另一种方法可以为特定日志实例设置日志名称。

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

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

于 2012-12-11T20:53:26.950 回答