java - 日志记录类名、方法名和行号的性能影响

标签 java performance logging log4j

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

考虑到在这种情况下人们不会奢侈地使用 IDE、开发工具(在 Debug模式下运行东西或单步执行代码),记录类名、方法名和行号真的很有用每条消息。

我在网上搜索日志记录的最佳实践,我遇到了 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.

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

上述情况适用于所有日志记录框架还是仅适用于其中一些? (作者在同一主题中引用了Logback)。我有兴趣了解在 Log4j 中执行此类操作对性能的影响。

最佳答案

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

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

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

关于java - 日志记录类名、方法名和行号的性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793226/

相关文章:

java - 在android中等待并通知

java - Android 以编程方式更新 apk

.net - 什么是.NET最好的过渡日志文件tracelistener

c++ - boost 记录器,多个日志文件和记录器

parsing - Hadoop Informatica 日志处理

java - 仅限于整数的浮点运算

java - 如何从 Firebase 数据库获取特定值(数据)

sql - 哪些索引有助于加快查询速度?

performance - 如何配置 Sitecore 以生成指向媒体项目的绝对链接?

php - 使用 MySQL 或 NoSQL 数据库