logging - 如何使用 Log4Net 登录每个线程的单独文件?

标签 logging multithreading log4net

我的应用程序使用多个具有明确名称的线程(即不是具有“匿名”线程的线程池)。现在,所有这些线程都将它们的日志消息发送到一个文件中——尽管线程 ID 是日志行的一部分,但这使得分析应用程序行为变得非常困难。因此,我希望每个线程都登录到自己的日志文件中。

Log4Net 似乎没有提供内置选项来根据线程选择附加程序。有谁知道解决这个问题的方法?请注意,我显然不想切换到另一个日志库。

最佳答案

“选择”appender 的 log4net 方式是通过过滤。在您的场景中,您需要一种设置多个 appender 的方法,每个 appender 代表一个明确定义的线程,并在每个 appender 中设置过滤器,仅通过来自各自线程的消息。

由于线程 ID 不是确定性的,因此您将需要其他东西来进行过滤。我假设您自己控制这些线程的创建,并建议每个线程在 the ThreadContext 中的属性中注册一个标识符。 .接下来你可以使用 the PropertyFilter根据标识符过滤消息。

这是一个示例配置设置,它有两个附加程序,每个附加程序都附加消息,其中属性 threadId 的当前值与给定的标识符匹配。

<appender name="x">
    <filter type="log4net.Filter.Property">
        <key value="threadId" />
        <stringToMatch value="threadX" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    ...
</appender>

<appender name="y">
    <filter type="log4net.Filter.Property">
        <key value="threadId" />
        <stringToMatch value="threadY" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    ...
</appender>

<root>
    <appender-ref name="x" />
    <appender-ref name="y" />
</root>

关于logging - 如何使用 Log4Net 登录每个线程的单独文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1612317/

相关文章:

java - 如何阻止我的程序永远等待? (等待/通知多线程问题)

asp.net - 无法让 Log4Net 在我的 ASP.NET 网站中工作 :(

c# - 带有 postsharp 2.0 的 Log4Postsharp(死了?)还是放弃了 ELMAH?

mysql - 记录 MySQL 查询并转发到系统日志/事件日志

asp.net - ASP.NET 开发服务器在哪里保存其日志?

python - 根记录器忽略记录器级别

c# - .Net Core Worker Service 作为 Windows 服务运行时找不到 log4net.config

java - 有理由避免使用 slf4j 吗?

java - 多线程程序无法运行

java - 何时有效地使用线程