在单独的线程上运行Log4Net appender

时间:2010-06-25 15:55:07

标签: c# multithreading log4net

目前,我有自己的日志系统,其中日志本质上是一个队列,一个单独的线程侦听该队列并执行所有实际的写操作。系统处理TON的日志消息,文件在几分钟内就可以轻松超过10 MB大小,因此在调用线程中进行实际的日志记录是不可行的。

如果log4net已经支持这种消息传递架构,或者其他类似的功能在线程环境中工作,我无法在线查找显示线程如何在log4net中工作的资源。是否有任何预先存在的功能可以帮助我?

这是否可以在不创建log4net包装的情况下实现?

5 个答案:

答案 0 :(得分:1)

如果您的日志数据依赖于特定的顺序,您可能需要重新考虑线程方法 - 线程可能会干扰它并最终不按顺序发布日志条目。

可以尝试使用MSMQ(或其他一些队列技术)快速将日志消息发送到其他进程,然后进行物理写入存储。这将保证消息的显示顺序与发送顺序相同。

答案 1 :(得分:1)

这不是一个坏主意。诀窍是将条目排队并在单个队列中处理它们。看看http://www.drdobbs.com/visualstudio/225700095就是一个很好的例子。

答案 2 :(得分:1)

您可以随时查看log4net的源代码,以了解这些问题。它是开源的。

答案 3 :(得分:0)

如果使用.NET Framework 4,则可以使用BlockingCollection来保留日志序列

答案 4 :(得分:0)

我使用ParallelForwardingAppenderAsyncForwardingAppender appender取得了巨大成功。这些appender可从以下存储库中获得:

https://github.com/cjbhaines/Log4Net.Async

ParallelForwardingAppender利用BlockingCollection和任务并行库的其他方面来实现无损消息队列。

AsyncForwardingAppender在后​​台线程上使用环形缓冲区和10ms轮询周期来优先考虑应用程序性能而不是记录保真度。