我正在研究使用 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 看起来比 Log4net 慢大约 9 倍 Trace, ,经过 1,000 次迭代,差异为 8ms;这并不是一个显着的性能消耗。尽管如此,我预期的一些用例可能会调用记录数十万次的方法,而这些数字来自我的快速机器。在更典型的用户配置的较慢机器上,差异为 170 毫秒到 11 毫秒,这有点令人担忧。

这是 log4net 的典型性能,还是存在一些可以显着提高 log4net 性能的陷阱?

(笔记:我知道字符串格式可以改变执行时间;我试图比较苹果与苹果,我有没有格式化的测试用例和有格式化的测试用例;无论是否使用字符串格式,log4net 都会相应地变慢。)

到目前为止的故事:

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

解决方案

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

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

其他提示

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

Hth,Erich

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top