kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

Spring BootのLogbackでログファイルを分割して出力する

本章では、Spring BootでLogbackを利用して、ログファイルを用途に応じて出力先を変更する方法について紹介します。

はじめに

logbackは、log4jの考案者が後継プロジェクトとして、新しく開発したロギング機能です。logbackでは、log4jの利便性を兼ね備えつつ、パフォーマンスの向上が図られています。
第1章:はじめに

ログの出力ルールを設定

Spring BootでLogbackでは、設定ファイルを利用することで細かい調整が利きます。今回の紹介も設定ファイルを利用した手法です。
設定ファイルは、プロジェクトの「src/main/resources」に配下に、「logback.xml」を作成して配置します。記述例を以下に示します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
	<!-- 1. ログ出力のスタイルを定義 -->
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS}[%thread][%-5level][%logger] %msg%n</pattern>
		</encoder>
	</appender>
	<appender name="FILE"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>logs/File.log</file>
		<append>true</append>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>logs/File.%d{yyyyMMdd}.log</fileNamePattern>
			<maxHistory>5</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread][%-5level][%logger] %msg%n</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
			<level>INFO</level>
		</filter>
	</appender>	
	<appender name="LOGIN"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>logs/Login.log</file>
		<append>true</append>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>logs/Login.%d{yyyyMMdd}.log</fileNamePattern>
			<maxHistory>100</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%msg%n</pattern>
		</encoder>
	</appender>
	<appender name="HISTORY"
		class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>logs/History.log</file>
		<append>true</append>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>logs/History.%d{yyyyMMdd}.log</fileNamePattern>
			<maxHistory>100</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%msg%n</pattern>
		</encoder>
	</appender>

	<!-- 2. アプリ側での参照名を定義 -->
	<logger name="com.projectName.serviceName.Login"
		additivity="false">
		<level value="INFO" />
		<appender-ref ref="LOGIN" />
	</logger>
	<logger name="com.projectName.serviceName.History"
		additivity="false">
		<level value="INFO" />
		<appender-ref ref="HISTORY" />
	</logger>

        <!-- 3. 標準ログ出力 -->
	<root level="INFO">
		<!-- コンソールログ -->
		<appender-ref ref="STDOUT" />
		<!-- ファイルログ -->
		<appender-ref ref="FILE" />
	</root>
</configuration>

logbackの詳細な書き方については、「Documentation」を参照してください。今回は、ログファイルを分割して出力するためのポイントだけ説明します。ログファイルの役割分担は、出力先を複数指定することで実現できます。標準ログは、「3」の親要素として設定します。一方で、任意のログは、「2」で定義することで標準で出力されるログとは違うファイルに出力できます。

プログラムでの利用方法

SLF4J」が提供する、ロギングライブラリを利用してログレベルに応じてログを書き込みます。

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

public class HogeHogeClass{
    // logback.xmlで設定した、参照名で呼び出す
    private final static Logger loginLogger = LoggerFactory
            .getLogger("com.projectName.serviceName.Login");
    private final static Logger historyLogger = LoggerFactory
            .getLogger("com.projectName.serviceName.History");

    public writeHogeHoge(){
        // ログを出力する!簡単!!
        loginLogger.info("hogehoge1");
        // 違うファイルに別のログを出力
        historyLogger.info("hogehoge2");
    }
}

筆休め

ログは、開発時には意識されませんが、運用時には非常に重要になってくるので、開発時にから強く意識する必要があります。
パフォーマンス、分析、諸々考慮して実装しましょう。

以上、「Spring BootのLogbackでログファイルを分割して出力する」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.