Logging Logback asyncAppender似乎不是线程安全的
我已经创建了一个AsyncAppender,在其中添加了我自己的摘要APPENDER 异步附加器如下所示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
<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项目的类路径中
- 运行一些并发程序来记录日志,以确保所有线程同时正确地记录日志
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上执行,我在这里只编写了一个。