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

时间:2012-06-20 10:47:09

标签: java logging 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)这些日志打印在日志文件中

6 个答案:

答案 0 :(得分:7)

  

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

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

  

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

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

  

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

由于:

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

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

      UPDATE - 对于log4j版本2,采用格式和参数的日志记录方法存在重载。这些可以减少在禁用级别的日志记录时的开销。

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

答案 1 :(得分:1)

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

另请参阅此问题:log4j performance

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

log4j.rootCategory=INFO, A1

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

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

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

答案 5 :(得分:0)

怎么样?

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