2
我已經通過添加自己的SUMMARY_APPENDER創建了一個AsyncAppender。Logback asyncAppender似乎不是線程安全的
異步追加程序是如下
<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正確由我的自定義附加目的地延長。
我已經把它作爲一個定製的jar和logback.xml導出。
我將它添加到新的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);
}
}
}
每個記錄儀的有310萬個記錄,所以在最後我預計1.5萬
請幫助我瞭解如何記錄同步,也讓我知道如果我我做錯了什麼。
我在代碼中只看到一個'main(...)'方法,沒有線程。如果您嘗試從多個JVM(即多個OS進程)寫入通用文件,則無法確保正確的同步寫入。 –
@GuillaumeDarmont我使用多個Main方法線程在同一個JVM上執行,我在這裏只寫了一個。 – chaosguru