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

Jen*_*ann 6 logging log4net multithreading

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

似乎Log4Net没有内置选项来根据线程选择一个appender.有谁知道这个解决方案?请注意,我显然不希望切换到另一个日志库.

Pet*_*old 4

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

由于线程 ID 不确定,您将需要其他东西来进行过滤。我假设您自己控制这些线程的创建,并建议每个线程在ThreadContext 的属性中注册一个标识符。接下来,您可以使用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>
Run Code Online (Sandbox Code Playgroud)

  • 如果直到运行时才知道线程的数量及其名称,您将如何执行此操作? (2认同)
  • @goku_da_master,您可以在代码中构建附加程序配置,这可能是一种方法,至少如果您控制线程创建的话。如果没有,我想说最好的选择是登录到一个公共源(例如数据库),可以更轻松地根据线程 ID 进行查询。 (2认同)