log4j2の設定方法と、
実際の出力例を紹介していきたいと思います。
log4j2とは、ログ出力を手助けしてくれる
Apacheが提供するオープンソースライブラリ1です。
使いこなせれば、障害の原因が
ログを見れば分かったり、
ログファイル作成のための
細かいプログラムを書かなくて良くなったりなど、
非常に強力なツールになります。
本記事は、コピペだけしたい方用に
コードだけまとめた箇所と
詳細な説明部分とで分けています。
コピペだけしたい方は、
サンプルコードと出力例をご覧ください。
ログのレベル一覧
出力されるログにはレベルがあります。
それぞれのレベルの用途に応じて、
ログを出力させる必要があります。
ログレベル | 使用用途 | 使用例 |
---|---|---|
FATAL | 致命的エラー(システム止めるくらいのエラー) | 正直僕はまだ使ったことない… |
ERROR | 一般的エラー(正常動作に支障をきたすくらいのエラー) | try-catchの際のエラー文の出力など |
WARN | メインプログラムではないエラー | バックアップしていたファイルの削除失敗時など |
INFO | 正常動作のログ(進捗状況など) | メソッドの実行始めと終わりなど |
DEBUG | 開発時に使用する | 発行するSQL文の確認、変数の確認など |
TRACE | 最も詳細なログ | あまり使わないかな。。。2 |
よく用いられるのは、
ERROR, INFO, DEBUG
の3つかと思います。
環境と必要ファイル
- /
- src
- main
- java
- メインプログラムのJavaファイル
- resources
- log4j2.properties(xmlやymlでも可)
- java
- main
- pom.xml
- src
サンプルコードと出力例
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath />
</parent>
<groupId>com.example</groupId>
<artifactId>HelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>HelloWorld</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
Log4j2SampleApplication.java
package com.example.demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author Takumi
*
*/
@SpringBootApplication
public class Log4j2SampleApplication {
public static void main(String[] args) {
SpringApplication.run(Log4j2SampleApplication.class, args);
Logger log = LogManager.getLogger(Log4j2SampleApplication.class);
log.trace("トレーーーース!!!!");
log.debug("デバーーーーック!!!!");
log.info("インフォーーーー!!!!");
log.warn("ウォーーーーーーーン!!!!");
log.error("エラーーーー!!!!");
log.fatal("ファターーーール!!!!");
}
}
コンソール出力の例
サンプルコード
log4j2.properties
#ログレベル
rootLogger.level = TRACE
#ログ出力にコンソールの設定追加
rootLogger.appenderRef.Consooole.ref = consooooleeeeeee
rootLogger.appenderRef.Consooole.level = TRACE
#コンソールへの出力
appender.Consooole.type = Console
appender.Consooole.name = consooooleeeeeee
appender.Consooole.target = SYSTEM_OUT
appender.Consooole.layout.type = PatternLayout
appender.Consooole.layout.pattern = %d %highlight{%5p} %c{-10} [%t] %m%n
出力例
ローリングファイル出力の例
サンプルコード
log4j2.properties
property.logDirectory = logs
#ログレベル
rootLogger.level = TRACE
#ログ出力にコンソールの設定追加
rootLogger.appenderRef.rooooooling.ref Roooooling
rootLogger.appenderRef.rooooooling.level = TRACE
#コンソールへの出力
appender.rooooooling.type = RollingFIle
appender.rooooooling.name = Roooooling
appender.rooooooling.filePattern = ${logDirectory}/rooooooolingggg_%d{yyyyMMdd}.log
appender.rooooooling.layout.type = PatternLayout
appender.rooooooling.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
appender.rooooooling.policies.type = Policies
appender.rooooooling.policies.time.type = TimeBasedTriggeringPolicy
appender.rooooooling.policies.time.interval = 1
appender.rooooooling.policies.size.type = SizeBasedTriggeringPolicy
appender.rooooooling.policies.size.size = 30M
出力先
- /
- logs
- rooooooolingggg_20231225.log
- src
- main
- java
- …
- java
- main
- target
- …
- ….
- logs
出力例
07:39:47.580 [main] TRACE com.example.demo.Log4j2SampleApplication - トレーーーース!!!!
07:39:47.580 [main] DEBUG com.example.demo.Log4j2SampleApplication - デバーーーーック!!!!
07:39:47.580 [main] INFO com.example.demo.Log4j2SampleApplication - インフォーーーー!!!!
07:39:47.580 [main] WARN com.example.demo.Log4j2SampleApplication - ウォーーーーーーーン!!!!
07:39:47.580 [main] ERROR com.example.demo.Log4j2SampleApplication - エラーーーー!!!!
07:39:47.580 [main] FATAL com.example.demo.Log4j2SampleApplication - ファターーーール!!!!
サンプルコード詳細説明
pom.xml
30〜35行目
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
この部分は、Spring Bootフレームワークのデフォルトの
Logbackというロギングフレームワークを除外します。
ちなみにこれを記述せずに、
実行すると、
このようにLogbackが優先され、
Logbackの設定にて出力されます。
LogbackはデフォルトではINFOレベルに
設定されており、FATALレベルの提供はないため、
このように出力されます。
Logbackについてのサンプルコードや出力例は、
こちらにまとめています。
気になる方は、ぜひご覧ください。
50〜53行目
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
これは、Log4j2を使用するための記述です。
これを記述し、
- /
- src
- main
- resources
- main
- src
の配下に、
log4j2.xml、log4j2.properties、log4j2.yml
のいずれかを追加。
そして、設定内容を記述することによって、
ログの出力をすることができます。
Log4j2SampleApplication.java
18行目
Logger log = LogManager.getLogger(Log4j2SampleApplication.class);
この行の引数(Log4j2SampleApplication.class)によって、出力されるログの、
この部分を設定できます。
ちなみにこの部分を変更して、
Logger log = LogManager.getLogger("ログが出力されてしまうぜ!!!");
このように変更すると、
このようにログの出力が変わります。
コンソール出力の例
log4j2.properties
1〜2行目
#ログレベル
rootLogger.level = TRACE
ここは、ログの全体制御の部分です。
デフォルトではINFOレベルに設定されており、
何も設定しないと、INFOレベル以上のレベルのログのみ出力されます。
基本、DEBUGに設定することが多いと思います。
4〜6行目
#ログ出力にコンソールの設定追加
rootLogger.appenderRef.Consooole.ref = consooooleeeeeee
rootLogger.appenderRef.Consooole.level = TRACE
共通して記載のあるappenderRefは、どのログの出力設定を使用するか
(Appenderを使用するか)を指定しています。
また、共通して記載のある
rootLogger.appenderRef.Consoooleにより、
“Consoole”という名前の設定を使用することを宣言しています。
rootLogger.appenderRef.Consooole.ref = consooooleeeeeee
これによって、”Consooole”というログの設定が
どの設定を参照するのかを指定します。
ここでは、”consooooleeeeeee”という名前を指定しています。
ここの名前と、後ほど出てくる設定の名前を一致させていないと、
うまくログが出力されません。
rootLogger.appenderRef.Consooole.level = TRACE
これにより、このログ出力の設定のログレベルを指定します。
注意点として、設定しているrootLogger.levelよりも
高いレベルで指定する必要があります。
ちなみに、よく出てくるrefは、reference(参照)の略です。
8〜13行目
#コンソールへの出力
appender.Consooole.type = Console
appender.Consooole.name = consooooleeeeeee
appender.Consooole.target = SYSTEM_OUT
appender.Consooole.layout.type = PatternLayout
appender.Consooole.layout.pattern = %d %highlight{%5p} %c{-10} [%t] %m%n
appender.Consooole.type = Console3は、ログの出力の種類を指定し、
ここでは、コンソールへの出力に指定してあります。
他にも様々種類がありますが、詳しくはこちらのサイトをご覧ください。
appender.Consooole.name = consooooleeeeeeeは、先ほどの
rootLogger.appenderRef.Consooole.ref = consooooleeeeeeeを指定しています。
appender.〇〇.nameとrootLogger.appenderRef.〇〇.refを一致させることで
設定したログが出力されます。
appender.Consooole.target = SYSTEM_OUTに関しては、
デフォルトで設定がされているので、なくてもいいです。
これは、JavaでいうSystem.out.printのような出力をしてくれます。
appender.〇〇.targetには、他に、SYSTEM_ERRも設定でき、
そうすると、System.err.printのような出力がされます。
appender.Consooole.layout.type = PatternLayoutは、
出力のレイアウトをどのようにするかを指定しています。
appender.〇〇,layoutには、他にも様々設定できますが、
もっと知りたい方はこちらのサイトをご覧ください。
appender.Consooole.layout.pattern = %d %highlight{%5p} %c{-10} [%t] %m%n
この部分に関しては、分けて説明を加えます。
%d | 日付の出力 |
%highlight{} | レベルごとの色付け |
%5p | 5文字分で表示 |
%c{-10} | カテゴリ(ロガー名)を最大10文字で表示 |
%t | スレッド名を表示 |
%m | ログメッセージを表示 |
%n | 改行 |
このような感じです。
これに関しても、他に様々あるので、
詳しく知りたい方は、こちらをご覧ください。
ここに記述したレイアウトで、
コンソールへログが出力されます。
ローリングファイル出力の例
コンソール出力の例で説明している部分については割愛します。
説明している部分は、
#ログレベル
rootLogger.level = TRACE
#ログ出力にコンソールの設定追加
rootLogger.appenderRef.rooooooling.ref = Roooooling
rootLogger.appenderRef.rooooooling.level = TRACE
appender.rooooooling.layout.type = PatternLayout
appender.rooooooling.layout.pattern = %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
です。
log4j2.properties
11〜13行目
appender.rooooooling.type = RollingFIle
appender.rooooooling.name = Roooooling
appender.rooooooling.filePattern = ${logDirectory}/rooooooolingggg_%d{yyyyMMdd}.log
appender.rooooooling.type = RollingFIleは、ログファイルを
日付ごとなどに出力(ローリング)する設定を示します。
appender.rooooooling.name = Rooooolingは、
rootLogger.appenderRef.rooooooling.ref = Rooooolingの部分を
指定しています。
appender.〇〇.nameとrootLogger.appenderRef.〇〇.refを一致させることで、
ログファイルの出力がされます。
appender.rooooooling.filePattern = ${logDirectory}/rooooooolingggg_%d{yyyyMMdd}.log
は出力ファイルのファイル名を指定します。
ここにスラッシュ(/)があると、ディレクトリ(フォルダ)として
認識します。
${logDirectory}の部分ですが、これは、1行目の
property.logDirectory = logs
ここで設定している、「logs」の部分が代入されます。
変数名として、property.logDirectoryの、「logDirectory」が設定されています。
設定されている変数名を${}で囲うと、設定した値が代入されます。
16〜21行目
appender.rooooooling.policies.type = Policies
appender.rooooooling.policies.time.type = TimeBasedTriggeringPolicy
appender.rooooooling.policies.time.interval = 1
appender.rooooooling.policies.size.type = SizeBasedTriggeringPolicy
appender.rooooooling.policies.size.size = 30M
appender.rooooooling.policies.type = Policies
これは、ローリングファイルの挙動を制御するための、複数の条件を指定できるようにするものです。
この記載があることにより、後に記載する、複数の条件を定義できます。
appender.rooooooling.policies.time.type = TimeBasedTriggeringPolicy
appender.rooooooling.policies.time.interval = 1
これは、新しいログファイルの出力が1日ごとにされることを
設定してます。
appender.rooooooling.policies.size.type = SizeBasedTriggeringPolicy
appender.rooooooling.policies.size.size = 30M
こちらは、新しいログファイルの出力が、
ファイルサイズ30MBになった時にされるようにしています。
話が戻りますが、
このように複数(今回だと2つ)の条件が設定を可能にするのが、
appender.rooooooling.policies.type = Policies
です。
脚注
参考サイト