c# - 写入具有多线程性能问题的 log4net FileAppender

标签 c# multithreading log4net fileappender

TickZoom 是一个非常高性能的应用程序,它使用自己的并行化库和多个 O/S 线程来平滑地利用多核计算机。

该应用遇到瓶颈,用户需要从单独的 O/S 线程将信息写入 LogAppender。

FileAppender 使用 MinimalLock 特性,这样每个线程都可以锁定并写入文件,然后释放它以供下一个线程写入。

如果 MinimalLock 被禁用,log4net 会报告有关文件已被另一个进程(线程)锁定的错误。

log4net 执行此操作的更好方法是让一个线程负责写入 FileAppender,而任何其他线程只需将它们的消息添加到队列中即可。

通过这种方式,可以禁用 MinimalLock 以大大提高日志记录的性能。

此外,该应用程序会执行大量 CPU 密集型工作,因此使用单独的线程写入文件也会提高性能,这样 CPU 就不会等待 I/O 完成。

那么问题来了,log4net已经提供这个功能了吗?如果是这样,您如何启用线程写入文件?也许还有另一个更高级的附加程序?

如果不是,那么由于 log4net 已经包含在平台中,因此可以在 TickZoom 代码中为此目的实现单独的线程和队列。

真诚的, 韦恩

编辑:

谢谢,答案似乎指向开发我们自己的解决方案,作为 log4net 的某种扩展。他们清楚地表明 log4net 不会做这种事情。

此外,我们刚刚意识到我们可能正在“滥用”日志系统,该系统主要用于人类可读的消息,用于通知重要事件或调试信息。软件输出的这一特定部分仅真正用于验证系统准确性的自动化工具。

当然,我们也以“正常”方式使用 log4net 进行调试、警告等。

但与调试或用户通知日志相比,这些更像是“事务日志”。更具体地说,这些日志没有必要直接供人类阅读。如有必要,某种“查看器”可以显示 ASCII 格式的内容。

因此我们计划将这些事务型日志写入高速二进制存储。

谢谢,下面的两个答案似乎都对我们开发自己的解决方案起到了很大的插入作用。

最佳答案

Log4net 不支持您描述的确切场景。然而,它确实提供了其他不锁定的附加程序,如数据库附加程序或 UDP 附加程序。这里有几个想法:

  1. 将您的消息记录到消息中 排队,然后有一个读者(或 几个读者)关闭消息 队列并将它们写入日志。 这提供了一个可靠的机制 发送/写消息。说实话 我不知道是否已经有一个 MSMQ appender,但是写它 你自己不会太辛苦。

  2. 使用UDP appender发送 消息,然后写你自己的 听这些的服务 消息并将它们写入文件。

我认为您可以在这里检测到一个主题...基本上使用非阻塞附加程序之一(或编写您自己的附加程序)并实现您自己的服务以接收来自附加程序的消息并将它们写入文件。

关于c# - 写入具有多线程性能问题的 log4net FileAppender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784371/

相关文章:

c# - 轻推 WPF 窗口

c# - 如何将 LinkBut​​ton 打印到页面?

asp.net - Log4Net、ThreadContext 和 Global.asax

c - pthread create 中传递的结构参数被破坏

c# - 使用线程的异步 Rest API 调用会影响性能吗?

c# - 依赖注入(inject)和命名记录器

c# - 在 log4net 中以编程方式更改日志级别?

c# - 在后面的代码中赋予 <a> 样式

c# - int e = 0000007 的 toString() 省略所有零。我怎样才能保存它们?

C++ - Clutter 1.0 - 从线程调用函数导致段错误