logback asyncAppender似乎不是线程安全的

时间:2013-07-12 10:14:06

标签: logging logback appender rollingfileappender log4j2

我通过在其中添加自己的SUMMARY_APPENDER来创建AsyncAppender。

ASYNC Appender如下

 <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
 <discardingThreshold>2</discardingThreshold>
 <appender-ref ref="SUMMARY_APPENDER" />
 <!--   <appender-ref ref="PROCESSING" /> -->
 </appender>

我创建了另一个SUMMARY_APPENDER

<appender name="SUMMARY_APPENDER"
    class="com.my.test.logger.async.MyRollingAppender">
    <file>./logs/summary.log</file>
    <rollingPolicy class="com.my.test.logger.async.MyTimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>./logs/%d{yyyy-MM-dd,aux}/summary.%d{yyyy-MM-dd}.%i.log
        </fileNamePattern>
        <TimeBasedFileNamingAndTriggeringPolicy
            class="com.my.test.logger.async.MySizeTimeBasedPolicy">
            <maxFileSize>10MB</maxFileSize>
        </TimeBasedFileNamingAndTriggeringPolicy>
        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
        <pattern>
            %d{ISO8601} [%t] %p %c %L - %m%n
        </pattern>
    </encoder>
</appender>

RollingPolicy由我的Custom Appenders正确扩展。

  • 我已将其导出为带有logback.xml的自定义jar。

  • 我将它添加到新java项目的classpath中。

  • 执行一些并发程序进行日志记录,以确保所有线程都同时正确地记录它。

程序如下,我创建了TestLogger1,2 ... 5并运行它们。

 public class TestingLogger {
 private static Logger log = LoggerFactory.getLogger(TestingLogger.class);
   public static void main(String[] args) {
    LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    StatusPrinter.print(lc);
    for (int i = 1; i < 100000; i++) {
        log.debug(" Testing Logger " + i);
    }
  }
}

每个Logger都有.1百万个日志,所以最后我预计.5百万

请帮助我了解如何同步日志记录,并让我知道如果我做错了什么。

1 个答案:

答案 0 :(得分:7)

从手册:

discardingThreshold

默认情况下,当阻塞队列剩余20%的容量时,它将丢弃级别为TRACE,DEBUG和INFO的事件,仅保留级别为WARN和ERROR的事件。要保留所有事件,请将discardingThreshold设置为0。

因此,在配置中将此属性设置为2,您应该看到所有消息都到达日志文件中。