我的应用程序使用多个具有明确定义名称的线程(即不是具有“匿名”线程的线程池)。现在,所有这些线程都将其日志消息发送到一个文件 - 尽管线程ID是日志行的一部分,但这使得分析应用程序行为变得非常困难。因此,我希望每个线程都能登录到自己的日志文件中。
似乎Log4Net没有内置选项来根据线程选择一个appender。有谁知道这个解决方案?请注意,我显然不希望切换到另一个日志库。
答案 0 :(得分:4)
“选择”appender的log4net方式是通过过滤。在您的场景中,您需要一种设置多个appender的方法,每个appender代表一个定义良好的线程,并且每个appender中都有过滤器,只能从各自的线程中传递消息。
由于线程ID不是确定性的,因此您需要其他东西来进行过滤。我假设您自己控制这些线程的创建,并建议每个线程在the ThreadContext的属性中注册一个标识符。接下来,您可以使用the PropertyFilter根据标识符过滤邮件。
这是一个示例配置设置,它有两个appender,每个appender附加消息,其中属性 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>