Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Logback asyncAppender似乎不是线程安全的_Logging_Logback_Appender_Rollingfileappender_Log4j2 - Fatal编程技术网

Logging Logback asyncAppender似乎不是线程安全的

Logging Logback asyncAppender似乎不是线程安全的,logging,logback,appender,rollingfileappender,log4j2,Logging,Logback,Appender,Rollingfileappender,Log4j2,我已经创建了一个AsyncAppender,在其中添加了我自己的摘要APPENDER 异步附加器如下所示 <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <discardingThreshold>2</discardingThreshold> <appender-ref ref="SUMMARY_APPENDER" /> <!-- <a

我已经创建了一个AsyncAppender,在其中添加了我自己的摘要APPENDER

异步附加器如下所示

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

2.
我已经创建了另一个摘要追加器

<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>

./logs/summary.log
./logs/%d{yyyy-MM-dd,aux}/summary.%d{yyyy-MM-dd}.%i.log
10MB
30
%d{ISO8601}[%t]%p%c%L-%m%n
RollingPolicy由我的自定义附加程序正确扩展

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

  • 我将它添加到新java项目的类路径中

  • 运行一些并发程序来记录日志,以确保所有线程同时正确地记录日志
程序如下所示,我创建了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);
    }
  }
}
公共类测试记录器{
私有静态记录器log=LoggerFactory.getLogger(TestingLogger.class);
公共静态void main(字符串[]args){
LoggerContext lc=(LoggerContext)LoggerFactory.getILoggerFactory();
状态打印机打印(lc);
对于(int i=1;i<100000;i++){
log.debug(“测试记录器”+i);
}
}
}
每个日志记录器都有.10万条日志,因此我预计最终会有.50万条日志

请帮助我了解如何同步日志记录,并告知我是否有任何错误。

手册:

丢弃阈值

默认情况下,当阻塞队列剩余20%的容量时,它将丢弃级别跟踪、调试和信息的事件,只保留级别警告和错误的事件。若要保留所有事件,请将discardingThreshold设置为0


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

我在代码中只看到一个
main(…)
方法,没有线程。如果您试图从多个JVM(即多个OS进程)写入公共文件,则无法确保正确的同步写入。@GuillaumeDarmont我使用多个主方法线程在同一JVM上执行,我在这里只编写了一个。