在单独的线程上运行Log4Net附加程序

5

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

我找不到在线资源展示log4net如何工作的线程方式,如果log4net已经支持这种消息传递架构或其他类似特性以在多线程环境下工作。是否有任何现有功能可以帮助我?

在不创建log4net包装器的情况下,是否可能实现这一点?

5个回答

1

如果您的日志数据需要按特定顺序排列,请重新考虑线程方法--线程可能会干扰该顺序,导致发布的日志条目无序。

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


MSMQ非常笨重,特别是对于这个任务来说。一个内存队列就足够了。 - Steven Sudit
一个内存队列是我的记录器当前实现的方式。我想我得扩展它以适配log4net并对它进行包装。或者创建自己的appender。 - Stefan Valianu
由于他正在使用队列,记录的顺序将与插入的顺序匹配,因此不会出现问题。 - Steven Sudit

1

1

你可以随时查看log4net的源代码来解决这类问题。它是开源的。


在一个庞大的类库中深入挖掘有点困难。然而,搜索new Thread没有任何有用的结果,搜索ThreadPool则显示了一个“有点”对我的目的有用但远远不够的附加程序。我猜我得自己制作附加程序。 :( - Stefan Valianu

0
如果您使用.NET Framework 4,您可以使用BlockingCollection来保持日志序列。

0

我曾经非常成功地使用了ParallelForwardingAppenderAsyncForwardingAppender附加器。这些附加器可以从以下存储库中获取:

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

ParallelForwardingAppender 利用 BlockingCollection 和其他 Task Parallel Library 的特性来实现无丢失消息队列。

AsyncForwardingAppender 利用环形缓冲区和后台线程上的 10ms 轮询周期,优先考虑应用程序性能而非日志保真度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接