我正在使用Log4Net
在.Net Windows service
应用程序中记录异常。
我想提一下,我的Windows服务应用程序正在运行multi-threading execution
,这意味着
每个任务都在每个不同的线程上处理,我使用了Delegate - (BeginInvoke)
模式。
重要的是,我使用dynamic properties
根据应用程序的不同情况使用Log4Net
动态生成多个日志文件。
现在,在每个logging/ exception
方案中(在C#方法中),我使用Logger.Log
方法使用Log4Net
记录信息/例外。
GlobalContext.Properties[FileNameParameter] = DirectoryName + fileName;
LogManager.Info(logMessage);
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="D:\Data\%property{FileName}_info.log"/>
</appender>
问题是(我相信),由于多线程代码执行,我正在使用Log4Net进行跟踪,这很奇怪。
请您告诉我为什么Log4Net会像这样。我需要执行多线程代码的稳定日志记录。
提前致谢!
答案 0 :(得分:4)
我实际上并没有尝试过你正在做的事情,但我可以看到你的代码存在两个会导致问题的问题。 (我不希望日志记录信息丢失,但我希望信息会转到错误的文件中。)
首先,如果期望在不同的线程上更改属性,则应该使用 ThreadContext 而不是GlobalContext。这个问题很容易解决。
第二个问题可能更成问题。 Log4net不希望在程序执行期间更改基本文件名,即使您更改了属性,也可能继续写入旧文件名。
解决此问题的最简单方法之一是重新初始化记录器。如果您使用app.config中的xml配置,则可以在设置属性后调用log4net.Config.XmlConfigurator.Configure();
。这显然有一个开销,你必须决定这个开销是否可以接受。