具有多线程代码执行的Log4Net C#日志记录问题

nun*_*unu 5 c# log4net multithreading windows-services exception

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);
Run Code Online (Sandbox Code Playgroud)

配置设置

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="D:\Data\%property{FileName}_info.log"/>
</appender>
Run Code Online (Sandbox Code Playgroud)

问题是(我相信),由于多线程代码执行,我正在跟踪Log4Net的事情,这很奇怪.

  1. 有时会生成日志文件,但没有消息内容.
  2. 有时文件本身没有生成.
  3. 有时几个文件生成,很少生成.

请你告诉我为什么Log4Net会像这样.我需要使用多线程代码执行的稳定日志记录.

提前致谢!

sgm*_*ore 4

我实际上并没有尝试做你正在做的事情,但我可以看到你的代码存在两个问题,这会导致问题。(我不希望日志信息丢失,但我希望这些信息会进入错误的文件)。

首先,如果属性预计在不同线程上更改,则应该使用ThreadContext而不是 GlobalContext。这个问题很容易解决。

第二个问题可能更成问题。Log4net 不希望在程序执行期间更改基本文件名,并且即使在更改属性后也可能会继续写入旧文件名。

解决此问题最简单的方法之一是重新初始化记录器。如果您使用 app.config 中的 xml 配置,则可以log4net.Config.XmlConfigurator.Configure();在设置属性后调用。这显然有一个开销,你必须决定这个开销是否可以接受。