log4j2とは?出力方法をサンプルで解説!

この記事は約19分で読めます。
木々

log4j2の設定方法と、
実際の出力例を紹介していきたいと思います。



log4j2とは、ログ出力を手助けしてくれる
Apacheが提供するオープンソースライブラリ1です。




使いこなせれば、障害の原因が
ログを見れば分かったり、
ログファイル作成のための
細かいプログラムを書かなくて良くなったりなど、
非常に強力なツールになります。



本記事は、コピペだけしたい方用に
コードだけまとめた箇所と
詳細な説明部分とで分けています。



コピペだけしたい方は、
サンプルコードと出力例をご覧ください。

ログのレベル一覧

出力されるログにはレベルがあります。



それぞれのレベルの用途に応じて、
ログを出力させる必要があります。

ログレベル使用用途使用例
FATAL致命的エラー(システム止めるくらいのエラー)正直僕はまだ使ったことない…
ERROR一般的エラー(正常動作に支障をきたすくらいのエラー)try-catchの際のエラー文の出力など
WARNメインプログラムではないエラーバックアップしていたファイルの削除失敗時など
INFO正常動作のログ(進捗状況など)メソッドの実行始めと終わりなど
DEBUG開発時に使用する発行するSQL文の確認、変数の確認など
TRACE最も詳細なログあまり使わないかな。。。2

よく用いられるのは、
ERROR, INFO, DEBUG
の3つかと思います。

環境と必要ファイル

  • Maven
  • Java 17
  • /
    • src
      • main
        • java
          • メインプログラムのJavaファイル
        • resources
          • log4j2.properties(xmlやymlでも可)
    • 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>
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("ファターーーール!!!!");
	}
}

コンソール出力の例

サンプルコード

#ログレベル
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

出力例


ローリングファイル出力の例

サンプルコード

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

出力先

  1. /
    • logs
      • rooooooolingggg_20231225.log
    • src
      • main
        • java
    • target
    • ….

出力例

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

の配下に、
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{}レベルごとの色付け
%5p5文字分で表示
%c{-10}カテゴリ(ロガー名)を最大10文字で表示
%tスレッド名を表示
%mログメッセージを表示
%n改行

このような感じです。
これに関しても、他に様々あるので、
詳しく知りたい方は、こちらをご覧ください。



ここに記述したレイアウトで、
コンソールへログが出力されます。

ローリングファイル出力の例

コンソール出力の例で説明している部分については割愛します。



説明している部分は、

3〜4行目

#ログレベル
rootLogger.level = TRACE

6〜9行目

#ログ出力にコンソールの設定追加
rootLogger.appenderRef.rooooooling.ref = Roooooling
rootLogger.appenderRef.rooooooling.level = TRACE

14〜15行目

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
です。


この記事書くの時間かかったーーーーーーーーーーーーーーー。

脚注

  1. 一般公開されている、無償で使えるプログラム ↩︎
  2. TRACEレベルにログを出力すると、たくさんのログが出力されてしまい見にくくなる。 ↩︎
  3. 紛らわしいですが、ここでの「=」の後の「Console」は、自由に決めることはできず、決まりがあるものなので注意してください。 ↩︎