【问题标题】:Is log4net much slower than System.Diagnostics.Trace?log4net 是否比 System.Diagnostics.Trace 慢得多?
【发布时间】:2010-09-17 02:41:53
【问题描述】:

我正在研究使用 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[] 对象,但它没有t 显示 log4net 的大方差。)

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

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

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

到目前为止的故事:

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

【问题讨论】:

  • System.Diagnostics.Trace 作为 DebugListeners 集合的一部分运行,因此将与最慢的侦听器一样快。默认侦听器写入 Debugger.Log(如果它正在记录)或系统“输出调试字符串”。注意:除非您需要将多个侦听器附加到您的跟踪输出 Trace.WriteXX 仍然太昂贵而无法在高性能日志记录情况下使用。如果必须写入调试输出,则应直接调用 kernal32.dll 上的 OutputDebugString 函数。 (至少比 Trace.WriteLine 快 50%)
  • System.Diagnosics v2 中的 TraceSource 怎么样?与 log4net 相比,它的表现如何?

标签: performance logging log4net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 日志记录在生产环境中是必不可少的!当出现问题时(他们会正确吗?),日志通常是您唯一需要处理的东西。日志记录性能经常被忽视,直到它开始让你陷入困境。 Log4Net 的编写并未考虑高性能/低影响。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      hth, 埃里希

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-03
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          • 2013-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多