gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:23:35 26 4
gpt4 key购买 nike

我正在使用 Log4Net 在我的 .Net Windows 服务 应用程序中记录异常。

我想提一下,我的 Windows 服务应用程序正在运行多线程执行,这意味着每个任务都在每个不同的线程上处理,我使用了 Delegate - (BeginInvoke) 模式。

重要的是,我正在使用 动态属性 根据应用程序的不同场景使用 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 进行跟踪,这很奇怪。

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

能否请您告诉我为什么 Log4Net 会这样。我需要通过多线程代码执行进行稳定的日志记录。

提前致谢!

最佳答案

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

首先,如果属性预计会在不同的线程上发生变化,您应该使用 ThreadContext 而不是 GlobalContext。这个问题很容易解决。

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

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

关于c# - 多线程代码执行的 Log4Net C# 日志记录问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16671481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com