我正在调查使用log4net和System.Diagnostics.Trace
进行日志记录之间的差异,我对我观察到的性能差异感到好奇。
我创建了一个测试应用程序来比较两种情况下两种日志记录方法的性能,我发现log4net明显慢于Trace
类。例如,在我记录1,000条没有字符串格式的消息的情况下,log4net超过1,000次试验的平均执行时间是9.00ms。 Trace
执行的平均值为1.13毫秒。我的很多测试用例在log4net执行时间上有很大的差异;异常长期执行的周期性似乎表明GC干扰。使用CLR Profiler进行了调查,确认生成了大量log4net.Core.LoggingEvent
个对象的大量集合(公平地说,看起来Trace
生成了大量Char[]
个对象。好吧,但它没有显示log4net所做的大差异。)
我在这里要记住的一件事是,尽管log4net似乎比Trace
慢大约9倍,但差异是1,000次迭代的8ms;这并不是一个显着的性能消耗。尽管如此,我的一些预期用例可能是调用数十万次记录事物的方法,这些数字来自我的快速机器。在较慢的机器上,更典型的用户配置,差异是170毫秒到11毫秒,这更令人担忧。
这种性能是log4net的典型特征,还是有一些可以显着提高log4net性能的问题?
(注意:我知道字符串格式化可以改变执行时间;我试图比较苹果和苹果,我有没有格式化的测试用例和带格式化的测试用例; log4net保持比例慢是否为字符串是否使用格式。)
到目前为止的故事:
Trace
类慢得多,我感到很好奇。答案 0 :(得分:12)
是的log4xxx比跟踪要慢,因为trace通常是近乎核心的工具,而log4xxx是一个更强大的工具。我个人更喜欢log4xxx因为它的灵活性,但如果你想要的东西不会影响那么多,并且你真的不需要生产日志,比如在调试中只有跟踪就足够了。
注意:我使用log4xxx,因为完全相同的情况适用于所有带有log4库的语言而不仅仅是.Net
答案 1 :(得分:6)
您可能对Common.Logging library感兴趣。它是现有日志记录实现的精简抽象包装器,允许您在运行时插入您喜欢的任何日志记录框架。它也比我的blog post about performance中描述的System.Diagnostics.Trace快得多。
HTH, 埃里希
答案 2 :(得分:4)
根据我的经验,在大多数情况下,log4net性能不是问题。 真正的问题是,为什么你甚至需要在生产系统中“记录成千上万次” 在我看来,在生产中你应该只记录最低限度(信息可能是警告级别),并且只有在需要(在现场调试问题)时才应在调试级别激活调试。
答案 3 :(得分:1)
如果您想要两全其美,log4net也允许您登录到aspnet跟踪器。当我想获得与我的日志记录中的特定事件相关的性能统计数据时,我打开此选项。
答案 4 :(得分:0)
与使用Log4Net执行相同任务相比,刚刚运行了一个将序列写入与简单文件进行比较的测试。与StreamWriter相比,Log4Net慢了约400倍。所以我认为如果写入巨大的内容,Log4Net不可用日志文件即可。但我发现非常适用于少量日志条目和调试。
在某些情况下,也许是在单独的线程中隔离日志记录的解决方案。