🥲

Java spring bootログ出力 Apache Log4j2

2024/10/16に公開

Apache Log4j2について

ネットに良いの無くって3時間も詰まったためメモとして残します。

まず、Apache Log4j2とはJavaアプリケーション向けのロギングライブラリ。
ロギング(logging)、コンピューターの動作記録やアクセス履歴などを定期的に記録することです

柔軟なログ出力(コンソール、ファイル、データベースなど)
異なるログレベル(INFO、DEBUG、ERRORなど)のサポート
設定の柔軟性(XML、JSON、YAML、プロパティファイル)
高パフォーマンスな非同期ロギング

前のバージョンは脆弱性があったため最新バージョンを使ってください

Gradleによる依存関係の追加

build.gradle
dependencies {
    implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
    implementation group: 'org.apache.logging.log4j', name: 'log4j-jcl', version: '2.20.0'
}

デフォルトロギングの無効化

Spring Bootのデフォルトのロギングを無効化する

build.gradle
configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

設定ファイルの作成

src/main/resources/log4j2.xml
一般的にここに作成します。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %p %c{1} - %m%n"/>
        </Console>
        <File name="File" fileName="logs/app.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %p %c{1} - %m%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
        </Root>
    </Loggers>
</Configuration>

log4jの設定ファイルを使う宣言

application.properties
logging.config=classpath:log4j2.xml

Javaコード内での使用例

java
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyApp {

    private static final Logger logger = LogManager.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.info("アプリケーションが開始しました。");
        try {
            logger.debug("デバッグ情報");
        } catch (Exception e) {
            logger.error("エラーが発生しました", e);
        }
    }

}

実行

アプリケーションを実行してログがコンソールおよび指定したファイルに出力されることを確認してください。

まとめ
現在調べた限りではjavaでログ出力する際にLog4j2かSLF4J+logbackどっちかが良いって言われてるみたいなのでSLF4J+logbackの方も調べてみてください。

ちなみにMavenでの依存関係

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
<!-- 最新のバージョンに更新してください -->
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>

Discussion