このチュートリアルでは、Logback `Mapped Diagnostic Context(MDC)`と `SiftingAppender`を使ってスレッドごとに別々のログファイルを作成する方法を説明します。
__P.S Logback 1.1.2でテストされ、以前のバージョンで動作するはずです。
1. logback.xmlの例
SiftingAppender`と
MDC`を宣言して設定する方法を示す `logback.xml`ファイル。
logback.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="USER__HOME" value="C:\\logs\\analyzer"/> <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender"> <!-- This is MDC value --> <!-- We will assign a value to 'logFileName' via Java code --> <discriminator> <key>logFileName</key> <defaultValue>head0</defaultValue> </discriminator> <sift> <!-- A standard RollingFileAppender, the log file is based on 'logFileName' at runtime --> <appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${USER__HOME}/${logFileName}.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern> %d{yyyy-MM-dd HH:mm:ss} %mdc[%thread]%level %logger{35} - %msg%n </Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>${USER__HOME}/${logFileName}.%i.log.zip </FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>10</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> </sift> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %-5level %logger{36} - %msg%n </Pattern> </layout> </appender> <logger name="com.mkyong.analyzer.core" level="debug" additivity="false"> <appender-ref ref="FILE-THREAD"/> <appender-ref ref="STDOUT"/> </logger> <root level="error"> <appender-ref ref="STDOUT"/> </root> </configuration>
2. Javaスレッドの例
単純なスレッドの例で、 `MDC.put`を介して ‘logFileName’の値を宣言しました。
Head.java
package com.mkyong.analyzer.core; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; public class Head implements Runnable { static Logger logger = LoggerFactory.getLogger(Head.class); private String name; @Override public void run() { MDC.put('logFileName', getName()); logger.debug("hello"); //remember remove this MDC.remove('logFileName'); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
10スレッドを開始
int count = 1; while(count<=10){ Head head = new Head(); head.setName("head-" + count); threadPools.execute(head); count++; }
出力:10個のスレッド用に10個の個別のログファイル。
-
注意** このMDC機能を使用すると、各ログインユーザ、各URIリクエスト、各リモートホストなどの別々のログファイルに出力を記録することさえできます。