【问题标题】:Performance Impact of logging class name , method name and line number记录类名、方法名和行号的性能影响
【发布时间】:2023-03-20 02:26:01
【问题描述】:

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

考虑到在这种情况下,人们无法使用 IDE、开发工具(以调试模式运行事物或逐步执行代码),记录类名、方法名和行号将非常有用每条消息。

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

你不应该包含文件名、类名和行号, 虽然这很诱人。我什至见过空的日志语句 从代码发出:

log.info("");

因为程序员假设行号将是 日志模式,他知道“如果出现空的日志消息 在文件的第 67 行(在 authenticate() 方法中),这意味着 用户已通过身份验证”。此外,记录类名、方法名 和/或行号会对性能产生严重影响。

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

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

【问题讨论】:

  • 对所有框架的性能影响都是一样的,因为获取文件名或行号的唯一方法是获取堆栈跟踪,这很昂贵。你需要一个预编译器或一些神奇的工具,它将这些信息添加到日志记录命令中,我不知道有任何这样的工具(我想,如果有人实现它,这将是一个很好的 Lombok 功能)。跨度>

标签: java performance logging log4j


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多