在我通常的日志记录体验中,我只是通过使用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;文件已创建。在我开始在每个对象中调用方法之前,一切似乎都很有效。当我交替调用时,首先将一个对象的数据写入另一个对象的文件,然后将数据记录到正确的文件中。例如,以下是发生的事情的简化示例:
如果我并行运行这两个方法,所有行都会写入一个文件或另一个文件。然后真正奇怪的是,另一个最常用的文件从未再次写入!
我不知道下一步该去哪儿。如果我通过GetLogger创建了一个Logger实例并向它传递了一个唯一的名称,并且这是一个私有成员变量,它怎么可能开始写入错误的文件?
答案 0 :(得分:0)
现在看来很明显“GlobalContext”对类名可疑。 :)我将调查一下,看看问题是该属性是否在所有Logger实例中共享,如果是,是否有另一种方法来设置特定日志实例的日志名称。
编辑 - 好吧,那不是它。我用<File value="TEMP" />
替换了logging.xml中的属性,然后在代码后面,我加载了FileAppender
并将其File
属性设置为正确的路径。行为是一样的。 :(
编辑 - 解决方案是为每个实例创建一个FileAppender
,而不是每个实例创建一个Logger
。我不确定为什么花了这么长时间才能得出这个结论,但我最终做了,现在看起来它正在发挥作用。