难以将来自多个实例的数据记录到单独的日志文件



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

但是,现在我遇到了想要记录到两个单独文件的情况。 我使用以下日志记录.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 创建了一个记录器实例,并向其传递了一个唯一的名称,并且这是一个私有成员变量,那么它怎么可能开始写入错误的文件?

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

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

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

最新更新