【发布时间】:2011-02-16 13:58:20
【问题描述】:
TickZoom 是一个非常高性能的应用程序,它使用自己的并行化库和多个 O/S 线程来顺利利用多核计算机。
应用遇到瓶颈,用户需要从单独的 O/S 线程将信息写入 LogAppender。
FileAppender 使用 MinimalLock 特性,这样每个线程都可以锁定并写入文件,然后释放它以供下一个线程写入。
如果 MinimalLock 被禁用,log4net 会报告有关文件已被另一个进程(线程)锁定的错误。
对 log4net 来说,一个更好的方法是让一个线程负责写入 FileAppender,而任何其他线程只需将它们的消息添加到队列中。
这样,可以禁用 MinimalLock 以大大提高日志记录的性能。
此外,应用程序会执行大量 CPU 密集型工作,因此使用单独的线程写入文件也会提高性能,因此 CPU 不会等待 I/O 完成。
所以问题是,log4net 是否已经提供了这个功能?如果是这样,您如何启用对文件的线程写入?也许还有另一个更高级的附加程序?
如果没有,那么由于 log4net 已经封装在平台中,因此可以在 TickZoom 代码中为此目的实现单独的线程和队列。
真诚地, 韦恩
编辑:
谢谢,答案似乎指向开发我们自己的解决方案,以某种方式作为 log4net 的扩展。他们清楚地表明 log4net 不会做这种事情。
此外,我们刚刚意识到我们可能正在“滥用”日志系统,该系统主要用于人类可读的消息,用于通知重要事件或调试信息。软件输出的这一特定部分仅真正用于验证系统准确性的自动化工具。
当然,我们也以“正常”的方式使用 log4net 进行调试、警告等。
但这些更像是“事务日志”,而不是调试或用户通知日志。更具体地说,这些日志没有必要直接供人类阅读。如有必要,某种“查看器”可以以 ASCII 格式显示内容。
因此,我们将计划将这些事务类型的日志写入高速二进制存储。
谢谢,下面的两个答案似乎都对开发我们自己的解决方案很有帮助。
【问题讨论】:
标签: c# multithreading log4net fileappender