我的应用程序使用多个具有明确名称的线程(即不是具有“匿名”线程的线程池)。现在,所有这些线程都将它们的日志消息发送到一个文件中——尽管线程 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/