在我通常的日志记录经验中,我只是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”文件。一切似乎都很好,直到我开始调用每个对象中的方法。当我交替调用时,一个对象的数据首先被写入另一个对象的文件,但随后数据被记录到正确的文件中。例如,这是一个简单的例子:
- test1.log() -> 写入 test1.log
- test2.log() -> 写入 test2.log
- test1.log() -> 写一行到 test2.log,然后剩下的写到 test1.log
- test2.log() -> 将 lint 写入 test1.log,然后将其余部分写入 test2.log
如果我并行运行这两种方法,所有行都会写入一个文件或另一个文件。那么真正奇怪的是,另一个最常用的文件再也没有被写入!
我不知道下一步该往哪里看。如果我通过 GetLogger 创建了一个 Logger 实例并为其传递了一个唯一名称,并且这是一个私有成员变量,它怎么可能开始写入错误的文件?