在单独的线程上运行Log4Net appender

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

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

如果不创建log4net包装器,这可能吗?

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

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

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

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

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

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

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

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

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