開発者ドキュメント

Logback – 各スレッドの異なるログファイル


logback-different-log-for-each-thread、width = 680、height = 278

このチュートリアルでは、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リクエスト、各リモートホストなどの別々のログファイルに出力を記録することさえできます。

モバイルバージョンを終了