2011-03-01 63 views
1

我的应用程序无限期运行多个并行独立的线程。我正在使用log4net来记录信息。为单独的线程动态加载log4net.Config? C#/。NET

我希望动态仪器log4net的日志记录配置信息。 (即:其中一个线程正在做一些奇怪的事情,我可以在进入时为其注入更详细的配置)。 我正在使用log4net.Config方法在其中一个线程中即时加载XML配置文件。不幸的是,它似乎影响了其他线程。

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

谢谢!

回答

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。我没有任何关系,只是一个满意的客户。

0

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

您可以通过的一个组合,让您的特定线程,并使用上下文过滤器:

编辑

仔细观察这些,似乎Mdc/Ndc是遗留特征,所以也许这不是'最好的选择。所以,这是另一个想法。

根据你如何识别你的线程(如果你不是在一个线程池中种植完全黑盒的任务),你可以简单地命名你的记录器,并使用过滤器来匹配记录器名称。

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

可以,只要在运行时配置的过滤器,你的方式加载你的配置,它会自动重载:Configuration Attributes(尤其是Watch = true)。

您也可以将您的PERF起来时不使用块像if(log.IsDebugEnabled) { /* do logging here */ }记录。

0

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

我在考虑性能或锁定。

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

最终溶液是声明不同追加程序不同记录器。对于每个实例化(以前认识他们!)记录仪,申报独家使用专用FileAppender,所以线程不会进入并发问题。

+0

我不同意。您可以将多个线程记录到同一个文件中,而不会出现并发问题。您无法保证日志条目的显示顺序,但我从来没有遇到任何问题。 OP没有锁定任何东西,他只想在运行时控制每个线程日志输出的详细程度。 – 2011-03-01 16:26:15

+0

我也不同意。如果线程共享同一个记录器实例,则不会发生并发问题(但可能会影响性能)。但是,如果他们每个调用一次GetLog,那么会创建多个实例。无论如何,他没有提到这些问题,这是真正的问题! – 2011-03-01 17:17:20