目前,我有自己的日志记录系统,其中日志本质上是一个队列,有一个单独的线程监听该队列并执行所有实际写操作。该系统处理大量的日志消息,文件在几分钟内很容易超过10 MB大小,因此在调用线程中进行实际记录是不可行的。
我找不到在线资源展示log4net如何工作的线程方式,如果log4net已经支持这种消息传递架构或其他类似特性以在多线程环境下工作。是否有任何现有功能可以帮助我?
在不创建log4net包装器的情况下,是否可能实现这一点?
目前,我有自己的日志记录系统,其中日志本质上是一个队列,有一个单独的线程监听该队列并执行所有实际写操作。该系统处理大量的日志消息,文件在几分钟内很容易超过10 MB大小,因此在调用线程中进行实际记录是不可行的。
我找不到在线资源展示log4net如何工作的线程方式,如果log4net已经支持这种消息传递架构或其他类似特性以在多线程环境下工作。是否有任何现有功能可以帮助我?
在不创建log4net包装器的情况下,是否可能实现这一点?
如果您的日志数据需要按特定顺序排列,请重新考虑线程方法--线程可能会干扰该顺序,导致发布的日志条目无序。
您可以尝试使用MSMQ(或其他队列技术)将日志消息快速发布到其他进程,然后由其进行物理写入存储。这将保证消息以发送时相同的顺序出现。
这不是一个坏主意。关键是将条目排队并在单个队列中处理它们。请查看http://www.drdobbs.com/visualstudio/225700095,以获取一个很好的例子。
你可以随时查看log4net的源代码来解决这类问题。它是开源的。
我曾经非常成功地使用了ParallelForwardingAppender
和AsyncForwardingAppender
附加器。这些附加器可以从以下存储库中获取:
https://github.com/cjbhaines/Log4Net.Async
ParallelForwardingAppender
利用 BlockingCollection 和其他 Task Parallel Library 的特性来实现无丢失消息队列。
AsyncForwardingAppender
利用环形缓冲区和后台线程上的 10ms 轮询周期,优先考虑应用程序性能而非日志保真度。