2013-07-12 74 views
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萬

請幫助我瞭解如何記錄同步,也讓我知道如果我我做錯了什麼。

+0

我在代碼中只看到一個'main(...)'方法,沒有線程。如果您嘗試從多個JVM(即多個OS進程)寫入通用文件,則無法確保正確的同步寫入。 –

+0

@GuillaumeDarmont我使用多個Main方法線程在同一個JVM上執行,我在這裏只寫了一個。 – chaosguru

回答

7

從手冊:

discardingThreshold

默認情況下,當阻擋隊列具有20%的容量剩餘,它將丟棄水平TRACE,DEBUG和INFO的事件,保持電平僅事件WARN和ERROR 。要保留所有事件,請將discardingThreshold設置爲0.

因此,在您的配置中將此屬性設置爲0,您應該看到所有消息到達日誌文件。

相關問題