代码之家  ›  专栏  ›  技术社区  ›  Mike

log4j rollingfileappender性能

  •  2
  • Mike  · 技术社区  · 7 年前

    我需要大量的日志以进行进一步的分析,因此当文件被滚动时,整个流会在执行以下操作时停滞一段时间:

    "org.springframework.kafka.KafkaListenerEndpointContainer#1-1-C-1" - Thread t@56
       java.lang.Thread.State: BLOCKED
        at org.apache.logging.log4j.core.appender.rolling.RollingFileManager.checkRollover(RollingFileManager.java:174)
        - waiting to lock <2afdff68> (a org.apache.logging.log4j.core.appender.rolling.RollingFileManager) owned by "SrpResultsProcessor-8" t@90
        at org.apache.logging.log4j.core.appender.RollingFileAppender.append(RollingFileAppender.java:280)
        at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
        at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
        at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:447)
        at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:432)
        at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:416)
        at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:402)
        at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
        at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
        at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2091)
        at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2005)
        at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1876)
        at org.apache.logging.slf4j.Log4jLogger.debug(Log4jLogger.java:124)
    ...    
    

    这是我的yaml配置:

    Configuration:
    name: default
    
    Appenders:
    
      RollingFile:
        - name: stdout
          fileName: ../logs/${component.name}.log
          filePattern: "../logs/archive/${component.name}_%d{yyyy-MM-dd}_%i.log.zip"
          PatternLayout:
            pattern: "%d{ISO8601} %-5level [%t] %logger{36} - %msg%n"
          Policies:
            SizeBasedTriggeringPolicy:
              size: 300 MB
          DefaultRollOverStrategy:
            max: 20
            Delete:
              basePath: ../logs
              maxDepth: 2
              IfFileName:
                glob: "*/${component.name}_*.log.zip"
                IfAccumulatedFileCount:
                  exceeds: 50
    
        - name: stderr
          fileName: ../logs/${component.name}.err
          filePattern: "../logs/archive/${component.name}_%d{yyyy-MM-dd}_%i.err.zip"
          PatternLayout:
            pattern: "%d{ISO8601} %-5level [%t] %logger{36} - %msg%n"
          Policies:
            SizeBasedTriggeringPolicy:
              size: 300 MB
          DefaultRollOverStrategy:
            max: 5
            Delete:
              basePath: ../logs
              maxDepth: 2
              IfFileName:
                glob: "*/${component.name}_*.err.zip"
                IfAccumulatedFileCount:
                  exceeds: 10
    ...
    

    有什么改进“滚动”性能的想法吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Mike    7 年前
    -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
    

    source

        2
  •  0
  •   devwebcl    7 年前

    这是一个高并发性的问题,它按设计工作。文件系统(I/O)没有达到要求的性能。

    这个 同步的 当试图获取资源时,阻止一些Java监视器。

    /**
     * Determines if a rollover should occur.
     * @param event The LogEvent.
     */
    public synchronized void checkRollover(final LogEvent event) {
        if (triggeringPolicy.isTriggeringEvent(event)) {
            rollover();
        }
    }
    

    上面提到的解决方案是转移到异步日志记录。

    https://logging.apache.org/log4j/2.x/manual/async.html