Open4

logback-spring.xmlとは何か?

ふじしろふじしろ

設定方法

resources直下(application.propertiesなどを置くところ)に作成する

参考:Spring Bootでlogback-spring.xmlを使ったロガーの設定 - ブロックチェーンエンジニアの備忘録

記述方法について

上記参考をもとに記載の意味について整理したもの

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

    <!-- デフォルトで継承したい設定の読み込み -->
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <!--  propertyタグで指定した内容は後から${name}の形で値を取り出すことができる。  -->
    <!-- 出力されるログファイルの名前 -->
    <property name="logFileName" value="app"/>

    <!--ローカル環境用設定 -->
    <springProfile name="default">
        <!-- "./"で"src"ディレクトリ直下に出力される -->
        <property name="logFilePath" value="./"/>
    </springProfile>

    <!--develop環境用設定 -->
    <springProfile name="develop">
        <property name="logFilePath" value="/var/log/develop/"/>
    </springProfile>

    <!--production環境用設定 -->
    <springProfile name="production">
        <property name="logFilePath" value="/var/log/production/"/>
    </springProfile>

    <!-- コンソール出力("classに指定されたConsoleAppenderにより設定されている。) -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <!-- 出力される文字列に関する設定箇所 -->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- アプリケーションログのファイル書き出し -->
    <appender name="APPLICATION_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--ファイル名 -->
        <file>${logFilePath}${logFileName}.log</file>
        <!--  保存方法のルールを設定する部分      -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logFilePath}${logFileName}-%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <maxHistory>3</maxHistory>
        </rollingPolicy>
        <!-- 出力される文字列に関する設定箇所 -->
        <!--    元のencoderの記述    -->
        <!--        <encoder>-->
        <!--            <charset>UTF-8</charset>-->
        <!--            <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] - %msg%n</pattern>-->
        <!--        </encoder>-->
        <!--この記述だけだとエラーになる-->
        <!--        <encoder>-->
        <!--            <pattern>%requestURL - %requestMethod - %statusCode %n</pattern>-->
        <!--        </encoder>-->
        <!-- Layout-accessを呼び出す必要がある?       -->
        <!--        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">-->
        <!--            <layout class="chapters.layouts.MySampleLayout"/>-->
        <!--            <pattern>%requestURL - %requestMethod - %statusCode %n</pattern>-->
        <!--        </encoder>-->
        <!--    こういうこと?    -->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <!--rootログレベルと使用出力ルール -->
    <!--  ここに記載したレベル以上のログが出力される  -->
    <root level="WARN">
        <!-- このappender-refタグで指定したappenderタグの内容が実際に実行される内容になる。 -->
        <!--        <appender-ref ref="STDOUT"/>-->
        <appender-ref ref="APPLICATION_LOG"/>
    </root>
</configuration>
ふじしろふじしろ

自分なりの記述メモ

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

    <!--  ファイル内で使えるプロパティ設定 -->
    <property name="logFileName" value="app"/>

    <!--  springのプロパティ設定(application.yml等)の呼び出し(springPropetyタグ) -->
    <springProperty name="logFilePath" source="logging.file.path"/>

    <!--  コンソールへのログ出力  -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%d{yyyy/MM/dd HH:mm:ss} %-5level [%thread] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- アプリケーションログのファイル書き出し -->
    <appender name="APPLICATION_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logFilePath}${logFileName}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- !重要!:fileNamePatternに指定した%dパターン文字列により、logbackはローリングスケジュールを決定する。 -->
            <fileNamePattern>${logFilePath}${logFileName}-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <charset>UTF-8</charset>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <!--  APIリクエストロガーの設定  -->
    <!--  loggerタグにname属性を付与することにより指定したパッケージやクラスで発生したログを指定したappenderで出力できる -->
    <logger name="com.example.Logger" level="INFO">
        <appender-ref ref="APPLICATION_LOG"/>
    </logger>

    <!--  ルートロガーの設定  -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
ふじしろふじしろ

RollingPolicyとは?

ログファイルを切り替える処理(Rolling)のルールを規定する設定。

例えば、以下のようなイメージ
今日(2022/09/01)のログがapp.logに保存されるとする。
時刻が明日(2022/09/02)の00:00:00になったタイミングで今日のログが、app-2022-09-01.logに保存される。
そして明日(2022/09/02)のログがapp.logに保存されるようになる。

上記のルールがあると、

  • 当日のデータは必ずapp.logに保存されている
  • 過去のデータは必ずapp-<過去の年月日>.logに保存されている
    という状態になり管理がしやすくなる。

TimeBasedRollingPolicyでは、fileNamePatternに設定した日付パターンを自動で読み取ってローリングの設定をしてくれる。

TimeBasedRollingPolicy |第4章 アペンダー