Java sl4j+logbackでログを出力する

Javaプログラムでログを出力する際に人気のある,sl4j+logbackを組み合わせた方法を紹介します.

目次

sl4jとlogbackの関係

  • SLF4Jはロギングシステム用のシンプルなファサードです。
  • ファサードとはデザインパターンのひとつで、様々なクラス群をまとめてアプリケーションに対して一つの窓口の役割を果たします。
  • SLF4Jを通じて利用されるロギングシステムの実態がlogbackやlog4jです。

以下がイメージです。

application → slf4j → logback

pom.xml

Mavenの場合

pom.xmlにdependencyを追加します。

<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>2.0.6</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>1.4.5</version>
</dependency>
<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-core</artifactId>
	<version>1.4.5</version>
</dependency>

gradleの場合

build.gradleに以下を追加します。

dependencies {
    implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.6'
    implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.4.5'
    implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.5'
}

logback.xml

logbackファイルの置き場所

gradle/mavenプロジェクトの場合は、logback.xmlを以下に配置します。

src/main/resources/logback.xml

logback.xml

logback.xmlの設定です。

<configuration>

    <!-- ディレクトリの末尾の/を忘れない。 -->
    <property name="logDir" value="./log/" />
    <property name="fileName" value="application.log" />
    <property name="format1" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%-4p] [%c] %m%n" />

    <!--  ファイル出力の際のログ設定  -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logDir}${fileName}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${format1}</pattern>
        </encoder>
    </appender>


    <!--  標準出力の際のログ設定  -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${format1}</pattern>
        </encoder>
    </appender>

    <!-- 出力するレベルの指定 -->
    <!-- 下記の例ではINFOレベルを指定しているので、INFO, WARN, ERRORレベルのログが出力され、DEBUGレベル以下のログは出力されません。 -->
    <root level="debug">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </root>

    <!-- 不要なログ出力を抑制 -->
    <logger name="io.grpc.netty.shaded.io" level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="CLOUD" />
    </logger>

</configuration>

ログ出力のサンプルコード

インスタンス変数としてloggerを呼び出す場合

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

public class LogSample {
    Logger logger = LoggerFactory.getLogger(getClass());

    public static void main( String[] args ) throws Exception {
        LogSample logSample = new LogSample();
        Logger logger = logSample.logger;
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

Static変数としてloggerを呼び出す場合

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

public class LogSample {
    private static final Logger logger = LoggerFactory.getLogger("TestLog");

    public static void main( String[] args ) throws Exception {
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

ローカル変数としてloggerを呼び出す場合

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

public class LogSample {

    public static void main( String[] args ) throws Exception {
        Logger logger = LoggerFactory.getLogger(LogSample.class);

        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

ログの出力結果

2022/12/26 18:37:37.695 [DEBUG] [LogSample] debug
2022/12/26 18:37:37.695 [INFO] [LogSample] info
2022/12/26 18:37:37.695 [WARN] [LogSample] warn
2022/12/26 18:37:37.695 [ERROR] [LogSample] error

標準出力に加え、./log/application.log.YYYY-MM-DD.logにもログファイルが出力されれば成功です。

よかったらシェアしてね!
目次