我的应用程序无限期运行多个并行独立的线程。我正在使用log4net来记录信息。为单独的线程动态加载log4net.Config? C#/。NET
我希望动态仪器log4net的日志记录配置信息。 (即:其中一个线程正在做一些奇怪的事情,我可以在进入时为其注入更详细的配置)。 我正在使用log4net.Config方法在其中一个线程中即时加载XML配置文件。不幸的是,它似乎影响了其他线程。
有没有办法使用log4net的时候隔离配置为每个线程?
谢谢!
我的应用程序无限期运行多个并行独立的线程。我正在使用log4net来记录信息。为单独的线程动态加载log4net.Config? C#/。NET
我希望动态仪器log4net的日志记录配置信息。 (即:其中一个线程正在做一些奇怪的事情,我可以在进入时为其注入更详细的配置)。 我正在使用log4net.Config方法在其中一个线程中即时加载XML配置文件。不幸的是,它似乎影响了其他线程。
有没有办法使用log4net的时候隔离配置为每个线程?
谢谢!
使用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。我没有任何关系,只是一个满意的客户。
我只是几乎没有开始使用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 */ }
记录。
你是什么意思,“不幸的是,它似乎影响其他线程”?
我在考虑性能或锁定。
如果你的线程被锁定(即。第一个线程日志,但在日志呼叫中的其他挂起),那么你需要FileAppender
MinimalLocking
选项。这样,一旦记录器写入日志文件,就会将文件句柄释放给其他线程。不幸的是,这会影响性能(但表现仍取决于内核:如果Mac或Linux的内核,当你去为单声道,在处理打开/关闭操作变得更快或更慢,你会得到不同的结果),因为连续收盘/平/打开。
最终溶液是声明不同追加程序和不同记录器。对于每个实例化(以前认识他们!)记录仪,申报独家使用专用FileAppender
,所以线程不会进入并发问题。
我不同意。您可以将多个线程记录到同一个文件中,而不会出现并发问题。您无法保证日志条目的显示顺序,但我从来没有遇到任何问题。 OP没有锁定任何东西,他只想在运行时控制每个线程日志输出的详细程度。 – 2011-03-01 16:26:15
我也不同意。如果线程共享同一个记录器实例,则不会发生并发问题(但可能会影响性能)。但是,如果他们每个调用一次GetLog,那么会创建多个实例。无论如何,他没有提到这些问题,这是真正的问题! – 2011-03-01 17:17:20