Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何使用Log4Net在每个线程中登录到单独的文件?_Logging_Multithreading_Log4net - Fatal编程技术网

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

Logging 如何使用Log4Net在每个线程中登录到单独的文件?,logging,multithreading,log4net,Logging,Multithreading,Log4net,我的应用程序使用多个具有良好定义名称的线程(即,不是具有“匿名”线程的线程池)。现在,所有这些线程都将它们的日志消息发送到一个文件中——尽管线程ID是日志行的一部分,这使得分析应用程序行为非常困难。因此,我希望每个线程都登录到自己的日志文件中 Log4Net似乎没有提供基于线程选择appender的内置选项。有人知道这个问题的解决方案吗?请注意,我显然不希望切换到另一个日志库。log4net“选择”附加器的方式是通过过滤。在您的场景中,您需要一种方法来设置多个appender,每个appende

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

Log4Net似乎没有提供基于线程选择appender的内置选项。有人知道这个问题的解决方案吗?请注意,我显然不希望切换到另一个日志库。

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

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

下面是一个示例配置设置,它有两个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>

...
...

如果运行时才知道线程的数量和名称,你会怎么做?@goku_da_master你可以在代码中构建appender配置,这可能是一种方法,至少如果你控制线程创建的话。如果不是,我想说最好的选择是登录到一个公共源(例如数据库),该源可以更容易地根据线程id进行查询。您最终做了什么?我有完全相同的要求,除了线程的数量和线程的名称直到运行时才知道或设置。我没有解决这个问题,因为我得到了一个新的作业。无论如何,Peter的解决方案对我来说是可行的,我想通过API创建appender配置对你来说是可行的