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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j日志会降低应用程序性能吗?相关的知识,希望对你有一定的参考价值。

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

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

[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)这些日志打印在日志文件中

答案

日志记录是否会降低应用程

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

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

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

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

因为:

  1. 代码中的某个地方是使用该消息调用Logger方法(可能是debug(String)
  2. 您的日志记录属性将appender的日志记录阈值设置为DEBUG。

为了提高性能:

  1. 更改ConversionPattern以使用更便宜的日期/时间格式,并且(更重要的是)避免使用'C','F','L'和'M',因为它们特别昂贵。
  2. 将日志记录阈值更改为INFO或WARNING或ERROR以减少日志记录量,
  3. Logger.debug(...)调用放在if语句中,该语句检查是否启用了调试日志记录。这样可以节省在不需要的情况下组装日志消息的成本;见In log4j, does checking isDebugEnabled before logging improve performance?。 更新 - 使用log4j版本2时,记录方法上存在带有格式和参数的重载。这些可以减少在禁用级别进行日志记录时的开销。

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

另一答案

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

另见这个问题:log4j performance

另一答案

记录可以是你cpu时间的30%或更多。就抖动而言,它与GC延迟一样大(且更经常)。

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

另一答案

是的他们这样做。这就是为什么你应该只记录错误或必须绝对记录的东西。您还可以在调试通道中记录有助于调试的信息,这样就不会影响生产性能。

另一答案

怎么样?

log4j.category.org.displaytag.tags.TableTag=ERROR, A1
另一答案

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

log4j.rootCategory=INFO, A1

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

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

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

以上是关于Log4j日志会降低应用程序性能吗?的主要内容,如果未能解决你的问题,请参考以下文章

你真的了解logback吗?

有旧的注释代码和代码中的大量空格会降低性能吗?

竞争条件会降低代码的性能吗?

JAVA反射会降低你的程序性能吗?

logback按天生成日志系统重启之后还会生成吗

过度使用硬盘会降低硬盘驱动器的性能吗?