目前,我有自己的日志系统,其中日志本质上是一个队列,一个单独的线程侦听该队列并执行所有实际的写操作。系统处理TON的日志消息,文件在几分钟内就可以轻松超过10 MB大小,因此在调用线程中进行实际的日志记录是不可行的。
如果log4net已经支持这种消息传递架构,或者其他类似的功能在线程环境中工作,我无法在线查找显示线程如何在log4net中工作的资源。是否有任何预先存在的功能可以帮助我?
这是否可以在不创建log4net包装的情况下实现?
答案 0 :(得分:1)
如果您的日志数据依赖于特定的顺序,您可能需要重新考虑线程方法 - 线程可能会干扰它并最终不按顺序发布日志条目。
您可以尝试使用MSMQ(或其他一些队列技术)快速将日志消息发送到其他进程,然后进行物理写入存储。这将保证消息的显示顺序与发送顺序相同。
答案 1 :(得分:1)
这不是一个坏主意。诀窍是将条目排队并在单个队列中处理它们。看看http://www.drdobbs.com/visualstudio/225700095就是一个很好的例子。
答案 2 :(得分:1)
您可以随时查看log4net的源代码,以了解这些问题。它是开源的。
答案 3 :(得分:0)
如果使用.NET Framework 4,则可以使用BlockingCollection来保留日志序列
答案 4 :(得分:0)
我使用ParallelForwardingAppender
和AsyncForwardingAppender
appender取得了巨大成功。这些appender可从以下存储库中获得:
https://github.com/cjbhaines/Log4Net.Async
ParallelForwardingAppender
利用BlockingCollection和任务并行库的其他方面来实现无损消息队列。
AsyncForwardingAppender
在后台线程上使用环形缓冲区和10ms轮询周期来优先考虑应用程序性能而不是记录保真度。