使用log4net进行高速日志记录

时间:2009-10-23 09:47:00

标签: .net performance logging log4net

我对log4net内的高速日志记录感兴趣(每秒大约10K消息)。 为此,我想到实现以下模块:

  1. 基于协议缓冲区的布局(IRawlayout) - 提供卓越的序列化性能
  2. 共享内存appender和插件 - 减少日志记录应用程序和日志记录服务器之间的IPC。
  3. 这是整合这些技术的方法吗?

    我还考虑在log4net中使用ETW,但它们似乎太不同了,不能优雅地整合。

2 个答案:

答案 0 :(得分:1)

我曾经看过google protobuffer,并得出结论,它对于日志记录的启动并不像最初看起来那样好。记录涉及大量文本,无论如何都是相同的文本。因此,protobuffers的可移植性不是一个优势。至于速度,我也不确定,你仍然需要通过电线将相同的文本传输到服务器,或者打包到protobuffer数据包或者用xml标记。当然,如果您要记录文本信息,这是相关的。在二进制日志记录的情况下,它可能是一件很酷的事情。

答案 1 :(得分:0)

前一段时间,我对log4net性能进行了调查,并创建了blog post

您可以找到几个log4net异步转发附加程序:

  1. 异步log4net解决方案1:BlockingCollection
  2. 异步log4net解决方案2:Hot swap technique
  3. 异步log4net解决方案3:.NET port of LMAX Disruptor

使用RollingFileAppender的异步log4net解决方案的性能结果:

enter image description here enter image description here enter image description here

关于log4net性能的一些注意事项:

    基于BlockingCollection的
  • AsyncForwardingAppenderBlocking 解决方案的效果非常差,尤其是对于一些日志记录生产者而言。
  • 基于热插拔技术的
  • AsyncForwardingAppenderHotSwap 解决方案表现最佳!但是,如果非常迅速地生成记录事件,则可能需要额外的内存,甚至会导致OutOfMemoryException!
  • 基于LMAX Disruptor的.NET端口的
  • AsyncForwardingAppenderDisruptor 解决方案表现不错,但即使使用NullAppender,它仍然与log4j2差距很大。最好调查一下Disruptor-net中可能存在的性能问题,或在记录案例中使用错误的情况。