我们有一个在多线程中运行并使用 Log4Net 作为日志记录框架的应用程序。我们遇到了一些日志事件没有被记录的场景。如文档中所述,FileAppender和其他 Appenders“对于多线程操作不安全”。
我在网上搜索了解决方案或 Appender,但找不到。
您知道使用环形缓冲区或队列来提供多线程支持的多线程安全 Log4Net Appender 吗?还是我们应该使用不同的多线程安全日志记录框架?
提前致谢!
最佳答案
我写了一些单元测试来重现这个问题:一个测试创建了 50 个线程,每个线程记录了 500 条消息。之后计算了写入的行数,结果我得到了 25,000 (50 x 500) 行,顺序不同。我在双核和八核机器上对其进行了测试。
我测试了一个静态记录器:
private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger");
并为测试类/线程的每个实例使用一个记录器:
ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString());
所有测试都是绿色的。
所以 Log4Net 工作正常并且可以很好地处理多线程场景。如果以正确的方式使用 Logger API,应更新 Appender 文档并声明支持多线程操作。
我猜我们在客户机器上遇到的丢失日志条目的问题是由其他问题引起的。可能底层 VM 或硬件已损坏。
感谢您的帮助!
关于c# - 多线程安全日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1519211/