【问题标题】:Log4j logs decreases application performance?Log4j 日志会降低应用程序性能?
【发布时间】:2012-06-22 11:49:39
【问题描述】:

日志记录会降低应用程序性能吗? 以及如何限制在日志文件中打印显示标签日志?

例如。我的日志文件有以下日志

[2012-06-20 15:52:06,290] org.displaytag.tags.TableTag isFirstIteration 684 - [data] first iteration=true (row number=1)
[2012-06-20 15:52:06,290] org.displaytag.tags.TableTag isFirstIteration 684 - [data] first iteration=true (row number=1)
[2012-06-20 15:52:06,290] org.displaytag.tags.TableTag isFirstIteration 684 - [data] first iteration=true (row number=1)
[2012-06-20 15:52:06,290] org.displaytag.tags.TableTag isFirstIteration 684 - [data] first iteration=true (row number=1)

为什么以上是在日志文件中?

log.properties 文件

# Log4j configuration file.
 log4j.rootCategory=DEBUG, A1
 # Available levels are DEBUG, INFO, WARN, ERROR, FATAL

 #
 # A1 is a ConsoleAppender 
 #

log4j.appender.A1 = org.apache.log4j.RollingFileAppender
log4j.appender.A1.File = C:/LogInfo/logfile.log
log4j.appender.A1.MaxFileSize = 100MB
log4j.appender.A1.MaxBackupIndex=50
log4j.appender.A1.layout = org.apache.log4j.PatternLayout
log4j.appender.A1.append = true
log4j.appender.A1.layout.ConversionPattern = [%d] %C %M %L - %m%n
log4j.appender.A1.Threshold = DEBUG

如何停止(org.displaytag.tags.TableTag)这类日志打印在日志文件中

【问题讨论】:

标签: java logging log4j


【解决方案1】:

日志记录会降低应用程序性能吗?

是的。它的作用取决于许多因素;见下文。

以及如何限制在日志文件中打印显示标签日志?

通过更改日志记录属性中的 ConversionPattern

为什么以上是在日志文件中?

因为:

  1. 代码中的某处是使用该消息调用 Logger 方法(可能是 debug(String)),并且
  2. 您的日志记录属性将日志记录阈值设置为附加程序的调试。

为了提高性能:

  1. 更改 ConversionPattern 以使用成本较低的日期/时间格式,并且(更重要的是)避免使用“C”、“F”、“L”和“M”,因为它们特别昂贵。
  2. 将日志记录阈值更改为 INFO 或 WARNING 或 ERROR 以减少日志记录量,
  3. Logger.debug(...) 调用放入if 语句中,以检查是否启用了调试日志记录。这节省了在不需要时组装日志消息的成本;见In log4j, does checking isDebugEnabled before logging improve performance?
  4. 对于 log4j 版本 2 (log4j2),在采用格式和参数的日志记录方法上存在重载。当日志记录处于禁用级别时,这些可以减少开销。
  5. 还要查看 logback 和 log4j 2.0。

您还可以在Logger 级别限制日志记录...如log4j documentation 中所述。事实上,该文档回答了您提出的大部分问题,并且在日志记录性能和日志记录配置方面提供了很多详细信息。

【讨论】:

  • 如果我使用 INFO 那么我会在我的日志文件中获得类似 (logger.debug(...)) 的日志吗?
  • @happy - 阅读手册......请参阅我的答案中的链接。这一切都在那里解释。 (答案是“不”。)
【解决方案2】:

简短回答:是的,它会降低应用程序性能,因为它会使用一些 CPU 周期和其他资源(内存等)。

另请参阅此问题:log4j performance

【讨论】:

    【解决方案3】:

    日志记录可以占您 CPU 时间的 30% 或更多。就抖动而言,它与您的 GC 延迟一样大(并且更频繁)。

    减少开销的一种简单方法是使用模式关闭记录每条消息的位置。在您的情况下,这是 %C %M 和 %L 因为它必须获取(整个堆栈的)堆栈跟踪才能获取此信息。

    【讨论】:

    • 如何使用Pattern关闭?
    【解决方案4】:

    是的。这就是为什么您应该只记录错误或必须绝对记录的内容。您还可以在调试通道中记录有助于调试的信息,以免影响生产性能。

    【讨论】:

    • 如何停止(org.displaytag.tags.TableTag)这类日志打印在日志文件中
    • @happy 将它们从您的转化模式中剔除。
    【解决方案5】:

    怎么样?

    log4j.category.org.displaytag.tags.TableTag=ERROR, A1
    

    【讨论】:

      【解决方案6】:

      您可以像这样限制垃圾日志。 将根记录器设置为 INFO,这样不必要的调试日志就不会出现并填满您的日志文件。

      log4j.rootCategory=INFO, A1
      

      如果您希望特定的类或包发出 DEBUG 日志,您可以这样做。

      log4j.logger.org.hibernate.event.def.DefaultLoadEventListener=DEBUG,A1
      

      上面将打印来自日志文件中 DefaultLoadEventListener 类的 DEBUG 级别日志以及其他 INFO 级别日志。

      【讨论】:

      • 如果我使用 INFO 那么我会在我的日志文件中获得类似(logging.debug(...)) 的日志吗?
      • 不会只有 logging.info(...) 日志。对于测试或调试,您应该使用 DEBUG 级别,对于部署,它应该是 INFO。如果您愿意,您可以专门启用 DEBUG 日志正如我在回答中提到的那样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2016-02-25
      相关资源
      最近更新 更多