为单独的线程动态加载log4net.Config? C#/。NET

时间:2011-03-01 05:36:24

标签: c# multithreading log4net

我的应用程序有许多无限运行的并行独立线程。我正在使用log4net来记录信息。

我想动态检测log4net的日志配置信息。 (即:其中一个线程正在做一些奇怪的事情,我可以动态地“注入”一个更详细的配置)。 我正在使用log4net.Config方法在其中一个线程中动态加载XML配置文件。不幸的是,它似乎影响了所有其他线程。

使用log4net时,有没有办法隔离每个线程的配置?

谢谢!

3 个答案:

答案 0 :(得分:1)

使用LogManager.GetLogger(“MyApp.Thread1”)为将要运行的每个线程创建一个新的记录器。此方法可以采用字符串,因此只需为每个字符串指定一个不同的名称。然后,您应该能够单独使用每个日志级别。

 <!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
    <level value="DEBUG" />
    <appender-ref ref="A1" />
</root>

<!-- Print only messages of level WARN or above in the package Com.Foo -->
<logger name="MyApp.Thread1">
    <level value="WARN" />
</logger>

更多信息: http://logging.apache.org/log4net/release/manual/configuration.html

此外,如果您刚入门,请查看Log4View。我没有任何从属关系,只有满意的客户。

答案 1 :(得分:0)

我自己几乎没有开始使用log4net,所以如果这没用,我会道歉,但我认为使用Contexts功能可以解决这个问题。

您可以通过组合使用上下文过滤器来获取特定线程:

修改

仔细观察,Mdc / Ndc似乎是传统功能,所以这可能不是最佳选择。所以,这是另一个想法。

根据您如何识别线程(如果您没有从线程池中完成黑盒任务),您可以简单地命名您的记录器,并使用过滤器匹配记录器名称。

http://logging.apache.org/log4net/release/sdk/log4net.Filter.LoggerMatchFilter.html

只要您以自动重新加载的方式加载配置,就可以在运行时配置过滤器:Configuration Attributes(特别是Watch = true)。

您还可以在不使用if(log.IsDebugEnabled) { /* do logging here */ }等块进行记录时保持性能。

答案 2 :(得分:0)

你是什么意思“不幸的是,它似乎影响了所有其他线程”?

我正在考虑表现或锁定。

如果您的线程被锁定(即第一个线程记录但另一个线程在记录调用中挂起),那么MinimalLocking需要FileAppender选项。这样,一旦记录器写入日志文件,它就会将文件句柄释放给其他线程。不幸的是,这会影响性能(但性能仍然取决于内核:如果是Mac或Linux内核,当你转到单声道时,处理打开/关闭操作会更快或更慢,你会得到不同的结果)因为连续关闭/刷新/开。

最终解决方案是声明不同的追加程序不同的记录程序。对于您实例化的每个记录器(之前都知道它们!),声明一个专用的FileAppender用于独占使用,因此线程不会进入并发问题。