关于性能:log4net比System.Diagnostics.Trace慢得多吗?

Is log4net much slower than System.Diagnostics.Trace?

我正在研究使用log4net和System.Diagnostics.Trace进行日志记录之间的差异,我对我观察到的性能差异很好奇。

我创建了一个测试应用程序来比较两种日志方法在几个场景中的性能,我发现log4net比Trace类慢得多。例如,在我记录1000条没有字符串格式的消息的场景中,log4net的平均执行时间超过1000次测试是9.00毫秒。Trace的平均执行时间为1.13毫秒。我的许多测试用例在log4net执行时间上有较大的差异;异常长执行的周期性似乎表明GC干扰。通过使用clr profiler,可以确认生成了大量的log4net.Core.LoggingEvent对象(公平地说,它看起来像Trace生成了大量的Char[]对象,但它没有显示log4net所做的巨大差异)。

我在这里记住的一件事是,尽管log4net的速度比Trace慢了大约9倍,但在1000次迭代中差异是8ms;这并不是一个明显的性能消耗。尽管如此,我的一些预期用例可能正在调用记录成百上千次的方法,这些数字来自于我的快速机器。在速度较慢的机器上,用户配置的典型差异是170ms到11ms,这是一个稍微更令人担忧的差异。

这是log4net的典型性能,还是有一些gotchas可以显著提高log4net的性能?

(注意:我知道字符串格式可以改变执行时间;我正在尝试将apple与apple进行比较,我有没有格式的测试用例和有格式的测试用例;无论是否使用字符串格式,log4net都保持成比例的慢。)

到目前为止的故事:

  • 罗伯特古尔德对这个问题有最好的答案;我主要好奇的是,log4net的表现是否比Trace类慢得多。
  • 亚历克斯·什纳耶的回答是有趣的信息,但并不属于问题的范围。引入此日志记录的一半目的是帮助调试实时系统上的逻辑和性能问题;我们的客户将我们的产品置于许多奇异的场景中,如果没有昂贵和大规模的硬件配置,这些场景通常很难重现。我主要担心的是,"不记录"和"记录"之间的时间差异很大,可能会以不会发生错误的方式影响系统。最后,性能下降的幅度很大,但幅度很小,所以我希望不会有问题。


是的,log4xx比trace慢,因为trace通常是一个接近内核的工具,而log4xx是一个更强大的工具。我个人更喜欢log4xx,因为它是易热的,但是如果您想要一些影响不大的东西,并且您实际上不需要日志来进行生产,那么说在调试中只跟踪就足够了。

注意:我使用log4xx是因为它适用于所有使用log4库的语言,而不仅仅是.NET。


您可能对common.logging库感兴趣。它是现有日志实现的一个瘦抽象包装器,允许您在运行时插入任何您喜欢的日志框架。此外,它比System.Diagnostics.Trace快得多,如我关于性能的博客文章中所述。

HTH埃里希


根据我的经验,在大多数情况下,log4net性能不是问题。真正的问题是,为什么您甚至需要在生产系统中"记录成百上千次的事情"。
正如我看到的,在生产中,您应该只记录最少的裸数据(信息nd可能是警告级别),并且只有在需要时(在现场调试问题)才应该在调试级别激活调试。


如果您想要两者兼得,log4net也允许您登录到aspnet跟踪程序。当我想要获取与日志中的特定事件相关联的性能统计信息时,我会启用此选项。


刚刚运行了一个测试,比较对一个简单文件的顺序写入与对同一个任务使用log4net相比。log4net比streamwriter慢400倍。所以我认为,如果您正在写入大型日志文件,log4net是不可用的。但是我发现它对于少量的日志条目和调试非常有用。

在某些情况下,可能是将日志隔离在单独的线程中的解决方案。