多线程安全日志记录

Ren*_*lte 8 .net c# logging log4net multithreading

我们有一个在多个线程中运行的应用程序,并使用Log4Net作为日志框架.我们遇到了一些未记录某些日志事件的情况.如文档提到的,FileAppender和其他附加目的地是" 没有对多线程操作安全".我在网上搜索了解决方案或Appender,但找不到任何解决方案.
您是否知道使用环形缓冲区或队列来提供多线程支持的多线程安全Log4Net Appender?或者我们应该使用不同的多线程安全日志记录框架吗?
提前致谢!

Ren*_*lte 15

我写了一些单元测试来重现问题:测试创建50个线程,每个线程记录500条消息.然后计算书面行,结果我得到了25,000(50 x 500)行不同的顺序.我在双核和八核机器上进行了测试.
我测试了一个静态记录器:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger");
Run Code Online (Sandbox Code Playgroud)

并为测试类/线程的每个实例使用Logger:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString());
Run Code Online (Sandbox Code Playgroud)


所有测试都是绿色的.

因此Log4Net运行良好,可以很好地处理多线程场景.应该更新Appender文档,并说明如果以正确的方式使用Logger API,则支持多线程操作.

我想我们在客户机器上遇到的缺少日志条目的问题是由其他问题引起的.也许底层的VM或硬件坏了.

谢谢你的帮助!


Dar*_*rov 8

我从来没有使用过FileAppender,也不能说它是否是线程安全的,但我从来没有遇到过RollingFileAppender的任何问题.文档声明该类型的成员不是线程安全的,但除非您尝试直接写入appender,否则这应该没问题.您不需要在以下调用中添加自己的锁定代码:

log.Info("message");
Run Code Online (Sandbox Code Playgroud)