日志记录 class 名称、方法名称和行号的性能影响

Performance Impact of logging class name , method name and line number

我正在我的 java 应用程序中实现日志记录,以便我可以调试应用程序投入生产后可能发生的潜在问题。

考虑到在这种情况下,人们不会奢侈地使用 IDE 开发工具(调试模式下的 运行 事物或单步执行代码),这将非常有用在每条消息中记录 class 名称、方法名称和行号。

我在网上搜索日志记录的最佳实践,发现 this article 上面写着:

You should never include file name, class name and line number, although it’s very tempting. I have even seen empty log statements issued from the code:

log.info("");

because the programmer assumed that the line number will be a part of the logging pattern and he knew that “If empty logging message appears in 67th line of the file (in authenticate() method), it means that the user is authenticated”. Besides, logging class name, method name and/or line number has a serious performance impact.

我试图了解日志记录 class 名称、方法名称和行号如何降低性能。

以上是对所有日志记录框架还是只对其中的一部分是正确的? (作者在同一主题中引用了Logback)。我有兴趣了解在 Log4j.

中做这样的事情对性能的影响

这里有不同的问题。 首先,记录一个简单的字符串有什么影响。这在很大程度上取决于您使用的基础设施。最近我做了 运行 一些基准测试,仅使用标准 java 日志记录 API 将字符串记录到文件中非常昂贵。您将使用 log4j 日志记录基础结构获得更好的结果,我的测试显示它的速度提高了 15 或 20 倍。

现在我们来考虑文件名和行号的问题。与 C 不同,java 没有 __FILE__ 和 __LINE__ 常量,它们由编译器(或 C 的预处理器)解析。如果你想记录文件名和行号,你有两个选择:

  1. 你居然自己把这样的文件名和行号写成常量。这对于文件名来说可能是可以接受的,但是如果您在记录的行上方引入任何行,行号将会改变,因此您将不得不去更改那里的所有行号。不太合理
  2. 您使用 java APIs 获取堆栈跟踪,如 here 所述。虽然此操作在 运行 时非常昂贵,因此会减慢您的程序。