2

内部に独自の SUMMARY_APPENDER を追加して、AsyncAppender を作成しました。

ASYNCアペンダーは以下の通りです

 <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 は、カスタム アペンダーによって適切に拡張されています。

  • これを 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);
    }
  }
}

各 Logger には 10 万個のログがあるため、最終的には 50 万個になると予想されます。

ロギングを同期する方法を理解するのを手伝ってください。また、何か間違ったことをしている場合はお知らせください。

4

1 に答える 1