c# - 多线程安全日志记录

标签 c# .net multithreading logging log4net

我们有一个在多线程中运行并使用 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/

相关文章:

c# - 使用 C# .net 检测进程已在 Windows 中运行

c# - 单功能类(命名为动词)

c# - 如何通过 Activator.CreateInstance 实例化对象并使用 Dapper 将其插入到表中

c - 如何在 Client.c 中使用文件作为参数

c# - 如何更改单个显示器 (NVidia Config) 的 Gamma 斜坡?

c# - 传递 web api 参数时出现 404

c# - 该命令需要至少两行源数据

c# - Process.Start() 中的错误——系统找不到指定的文件

java - 从服务器获取信息的线程被阻塞

具有固定数量线程和线程安全队列的 C++ 多线程