多线程代码执行的 Log4Net C# 日志记录问题
Posted
技术标签:
【中文标题】多线程代码执行的 Log4Net C# 日志记录问题【英文标题】:Log4Net C# logging issue with multi-thread code execution 【发布时间】:2013-05-16 07:22:41 【问题描述】:我正在使用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\%propertyFileName_info.log"/>
</appender>
问题是(我相信),由于多线程代码执行,我正在使用 Log4Net 进行跟踪,这很奇怪。
-
有时会生成日志文件,但没有消息内容。
有时文件本身不会生成。
有时生成的文件很少,但很少生成。
请告诉我为什么 Log4Net 会这样。我需要具有多线程代码执行的稳定日志记录。
提前致谢!
【问题讨论】:
【参考方案1】:我实际上并没有尝试做你正在做的事情,但我可以看到你的代码有两个问题会导致问题。 (我不希望日志信息丢失,但我希望信息会转到错误的文件)。
首先,如果预计属性会在不同线程上发生变化,您应该使用 ThreadContext 而不是 GlobalContext。这个问题很容易解决。
第二个问题可能更成问题。 Log4net 不希望在程序执行期间基本文件名发生更改,并且即使您更改了属性,也可能继续写入旧文件名。
解决此问题的最简单方法之一是重新初始化您的记录器。如果您使用 app.config 中的 xml 配置,您可以在设置属性后调用 log4net.Config.XmlConfigurator.Configure();
。这显然有开销,你必须决定这个开销是否可以接受。
【讨论】:
以上是关于多线程代码执行的 Log4Net C# 日志记录问题的主要内容,如果未能解决你的问题,请参考以下文章