18

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

我创建了一个测试应用程序来比较两种日志记录方法在几种情况下的性能,我发现 log4net 明显比Trace类慢。例如,在我记录 1,000 条没有字符串格式的消息的情况下,log4net 超过 1,000 次试验的平均执行时间为 9.00 毫秒。 Trace平均执行时间为 1.13 毫秒。我的很多测试用例在 log4net 执行时间上都有相对较大的差异;异常长时间执行的周期性性质似乎表明 GC 干扰。使用 CLR Profiler 确认log4net.Core.LoggingEvent生成了大量对象的大量集合(公平地说,它看起来也Trace生成了大量Char[]对象,但它并没有显示 log4net 的大差异。 )

我在这里要记住的一件事是,即使 log4net 看起来比 慢大约 9 倍Trace,但在 1,000 次迭代中差异是 8 毫秒;这并不是一个显着的性能消耗。尽管如此,我的一些预期用例可能会调用记录数十万次的方法,这些数字来自我的快速机器。在较慢的机器上,我们的用户配置更典型,差异是 170 毫秒到 11 毫秒,这有点令人担忧。

这种性能是 log4net 的典型表现,还是有一些可以显着提高 log4net 性能的陷阱?

注意:我知道字符串格式化会改变执行时间;我正在尝试将苹果与苹果进行比较,并且我有没有格式化的测试用例和带格式化的测试用例;无论是否使用字符串格式化,log4net 的速度都会保持成比例。 )

到目前为止的故事:

  • 罗伯特·古尔德(Robert Gould)对这个问题有最好的答案;我主要是好奇 log4net 的执行速度是否比Trace课堂慢得多。
  • Alex Shnayder 的回答是有趣的信息,但并不真正属于问题的范围。引入此日志记录的一半目的是帮助调试实时系统上的逻辑和性能问题;我们的客户将我们的产品置于许多奇特的场景中,如果没有昂贵的大规模硬件配置,这些场景通常很难重现。我主要担心的是“不记录”和“记录”之间的较大时间差异可能会影响系统,从而不会发生错误。最后,性能下降的规模很大,但幅度很小,所以我希望它不会成为问题。
4

5 回答 5

12

是的 log4xxx 比 trace 慢,因为 trace 通常是一个接近内核的工具,而 log4xxx 是一个更强大的工具。我个人更喜欢 log4xxx 因为它的灵活性,但如果你想要一些影响不大的东西,并且你真的不需要生产日志,那么在调试中说只有跟踪就足够了。

注意:我使用 log4xxx 是因为这同样适用于所有具有 log4 库的语言,而不仅仅是 .Net

于 2008-10-14T14:31:26.913 回答
6

您可能对Common.Logging 库感兴趣。它是对现有日志实现的精简抽象包装器,允许您在运行时插入您喜欢的任何日志框架。它也比我关于性能的博客文章中描述的 System.Diagnostics.Trace 快得多。

hth,埃里希

于 2009-05-04T08:57:47.330 回答
4

根据我的经验,log4net 性能在大多数情况下都不是问题。真正的问题是,为什么您甚至需要在生产系统中“记录数十万次”。
正如我所看到的,在生产中您应该只记录最低限度(信息可能是警告级别),并且只有在需要时(在现场调试问题)才应该在调试级别激活调试。

于 2008-10-14T21:42:13.347 回答
1

如果您想要两全其美,log4net 也将允许您登录到 aspnet 跟踪器。当我想要获取与日志记录中的特定事件相关的性能统计信息时,我会打开此选项。

于 2008-10-15T22:31:11.000 回答
0

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

在某些情况下,也许是在单独的线程中隔离日志记录的解决方案。

于 2013-05-14T11:53:49.333 回答