私のプロジェクトで使われている共有用の `logback.xml`の例をいくつか紹介します。

1.コンソールにログを送信する

すべてのロギングはコンソールにリダイレクトされます。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss}[%thread]%-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <logger name="com.mkyong.web" level="debug"
        additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="error">
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

2.ログをファイルに送る

すべてのロギングはファイル `c:/logs/debug.log`にリダイレクトされます。

さらに、このログファイルは毎日アーカイブされるか、ファイルサイズが10MBを超えます。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="DEV__HOME" value="c:/logs"/>

    <appender name="FILE-AUDIT"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV__HOME}/debug.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV__HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
                        </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

    </appender>

    <logger name="com.mkyong.web" level="debug"
        additivity="false">
        <appender-ref ref="FILE-AUDIT"/>
    </logger>

    <root level="error">
        <appender-ref ref="FILE-AUDIT"/>
    </root>

</configuration>

3.コンソールとファイルにログを送る

最後の例では、両方を組み合わせてもう1つの “ファイルエラー”アペンダーを追加してエラーメッセージのみを記録します。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="DEV__HOME" value="c:/logs"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss}[%thread]%-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="FILE-AUDIT"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV__HOME}/debug.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV__HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
                        </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

    </appender>

    <appender name="FILE-ERROR"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV__HOME}/error.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} - %msg%n
            </Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV__HOME}/archived/error.%d{yyyy-MM-dd}.%i.log
                        </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

    </appender>

    <!-- Send logs to both console and file audit -->
    <logger name="com.mkyong.web" level="debug"
        additivity="false">
        <appender-ref ref="FILE-AUDIT"/>
        <appender-ref ref="STDOUT"/>
    </logger>

    <root level="error">
        <appender-ref ref="FILE-ERROR"/>
    </root>

</configuration>

4. SiftingAppenderの例

ログを別のログファイルに送信します。ログファイル名は、実行時にMDCによって定義されます。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="DEV__HOME" value="c:/logs"/>

    <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">

          <discriminator>
        <key>logFileName</key>
        <defaultValue>head0</defaultValue>
      </discriminator>

      <sift>

        <appender name="FILE-${logFileName}"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${DEV__HOME}/${logFileName}.log</file>

            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <Pattern>
                    %d{yyyy-MM-dd HH:mm:ss}[%thread]%level %logger{35} - %msg%n
                </Pattern>
            </encoder>

            <rollingPolicy
                class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                <FileNamePattern>${DEV__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>

    <logger name="com.mkyong.web" level="debug"
        additivity="false">
        <appender-ref ref="FILE-THREAD"/>
    </logger>

    <root level="error">
        <appender-ref ref="FILE-THREAD"/>
    </root>

</configuration>

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
//...
public void run() {

    MDC.put('logFileName', "head1");

    logger.debug("hello");

    MDC.remove('logFileName');

}

  • 注意** この完全なリンク://logging/logback-different-log-file-for-each-thread/[Logback SiftingAppenderの例]を参照してください。

5.ログファイル名をプログラムで設定する


System.setProperty`を介してログファイル名

$ {log.name} ‘をプログラムで設定します。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="USER__HOME" value="/home/mkyong/ant/logs"/>

    <appender name="FILE-ENGINE-ERROR" class="ch.qos.logback.core.FileAppender">
        <file>${USER__HOME}/${log.name}.error</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss}[%thread]%-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE-ENGINE" class="ch.qos.logback.core.FileAppender">
        <file>${USER__HOME}/${log.name}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss}[%thread]%-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.mkyong.core" level="debug" additivity="false">
        <appender-ref ref="FILE-ENGINE"/>
    </logger>

    <root level="error">
        <appender-ref ref="FILE-ENGINE-ERROR"/>
    </root>

</configuration>

TestRunApp.java

package com.mkyong.core;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestRunApp {

   //No static, else log.name.IS__UNDEFINED.log
    private final Logger logger = LoggerFactory.getLogger(TestRunApp.class);

    public static void main(String[]args) {

       //Set this before the logger start.
        System.setProperty("log.name", "abcdefg");

        TestRunApp obj = new TestRunApp();
        obj.start();

    }

    private void start() {

        logger.debug("------ Starting Ant------");
       //...
    }

}

出力

Debug log file path/home/mkyong/ant/logs/abcdefg.log

Error log file path/home/mkyong/ant/logs/abcdefg.error

参考文献


  1. Logback appenders

  2. リンク://logging/log4j-log4j-properties-examples/[log4j.properties

例]