C# - 如何使用 log4net 属性 分配同时为一个(或多个)任务 运行 创建不同的日志文件?

C# - How to use log4net property assignment to create distinct log files for one (or more) Tasks running simultaneously?

我尝试在 Google 中搜索此内容并遇到了 this SO 问题。虽然这部分是我想要的,但我正在使用任务这一事实使问题有点复杂,我将解释。

所以,我正在开发的是一个帮助一线用户创建新的Active Directory账户和邮箱的程序。我有一个绑定到 BindingList 的 DataGridView,当需要将 List 中的数据处理为新用户时,它用于创建一系列 运行 彼此独立的并行任务。

我想做的是为每个正在创建的用户创建一个日志文件。我想做的是使用通用配置作为创建日志文件的基础(即关于日志级别、appender 等的相同约束......)但在名称中使用 %property{UserName} 字段日志文件,以便将与正在创建的不同用户相关的日志消息放入他们自己不同的日志文件中。这样,如果某个特定用户帐户的创建出现问题,一线用户(或我自己)就不需要挖掘一个巨大的日志文件来寻找问题用户。

使用上述 SO 问题中描述的方法,我能够在 log4net.config 文件中创建一个参数,并通过使用 ThreadContext.Properties["UserName"] = entry.Name.ToLower().Replace(" ", "_"); 访问 属性 我能够设置属性太值了!我面临的问题是我可以在 appender 的 conversionPattern 中使用 属性 并且用户名成功出现,但是将 属性 放在 appender 的文件名中只会导致名为 .\uman_user_tasks_(null).log 待创建。我尝试在程序代码中引发事件以强制 log4net 识别 属性 已更改,但这没有什么区别。

此外,我还担心,因为我使用一个 ILog 对象来记录多个用户帐户的创建,所以当我创建一系列执行同一部分的任务时,这不是正确的方法的代码。我可以创建一个使用 appender 配置但将用户名附加到文件末尾的工厂吗?

实现我所追求目标的最佳方式是什么?如果有帮助,请参阅下面的相关 log4net appender 配置部分。

<appender name="uman_users" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value=".\log\uman_user_tasks_%property{UserName}.log" />
    <param name="UserName" type="log4net.Util.PatternString" value="%property{UserName}" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="2MB" />
    <staticLogFileName value="false" />
    <preserveLogFileNameExtension value="true" />
    <datePattern value="_yyyyMMdd" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date (%method) [%level] (user: %property{UserName}) - %message%newline" />
    </layout>
  </appender>

我设法遇到了 another SO question which thankfully addressed the issue I was experiencing. As a result, instead of statically referencing a Logger configured in the log4net.config file, I instead used this method for dynamically creating the Appender and Logger objects before registering them in the LogManager

对于任何感兴趣的人,我还通过在使用后释放绑定到这些 Logger 对象的 Appender 来解决内存管理问题 using the methods described in this post