【log4j2】ログ出力先ファイル名やパスをカスタマイズする設定(日付など)

Java 向けの今どきなロギングライブラリ「log4j2」で、ログファイルを任意のパスに出力したり、ログファイル名に日付を入れる設定方法をまとめておきます。

日本語でGoogle検索したところ、Java プログラム側でファイル名・日付を生成する方法や古い情報しか見つからない気がしたので。今回は、設定ファイル「log4j2.xml」の中だけでファイル名に日付を入れていきます。

サーバー用途の場合だと、ファイル名に日付は使うのではなく、RollingFileAppender 辺りを使って自動ローテートするかとは思いますが、バッチ処理などの場合では今回のような設定が重宝するケースがあると思います。

というわけで、サンプルの log4j2.xml はこんな感じ。(ビルドパスが通っている場所に配置。不明ならソースディレクトリの最上位でも認識)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

    <!-- 設定ファイル内から参照するプロパティの定義 -->
    <Properties>
        <!-- パスは実行時に指定。現在日付込み -->
        <Property name="filename">${sys:logDirectory}YourAppName-${date:yyyyMMdd}.log</Property>
    </Properties>

    <!-- ログ出力先とログフォーマットの定義 -->
    <Appenders>
        <Console name="consoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%ex"/>
        </Console>

        <File name="fileAppender" fileName="${filename}">
            <PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n%ex"/>
        </File>
    </Appenders>

    <!-- パッケージ×ログレベル毎のログ出力先(Appender)を定義 -->
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="consoleAppender"/>
            <AppenderRef ref="fileAppender"/>
        </Root>
        <Logger name="com.example.YourPackage" level="TRACE" additivity="false">
            <AppenderRef ref="consoleAppender"/>
        </Logger>
    </Loggers>

</Configuration>

Java8 のラムダ式でログ出力する記述はこんな感じに。ラムダ式の遅延評価により、不必要な文字列オブジェクト生成が発生しないため、より高速です。

public class Main {
    public static void main(String[] args) {
        // log4j2 のログ出力先を指定 -> log4j2.xml
        System.setProperty("logDirectory", "./log/");
        Logger logger = LogManager.getLogger(Main.class);
        logger.info(() -> "これはテストのログ出力");
    }
}

先の log4j2.xml のサンプルのポイントは、Properties 内の ${prefix:name} 形式のプレースホルダーです。

たとえば現在日付に置換して欲しいなら、${date:yyyyMMdd} 、システムプロパティに置換して欲しいなら ${sys:PROPERTY_NAME} と書けば、自動で置き換えてくれるというわけ。

Property 定義のプレースホルダーで利用できるプリフィックスの一覧は、公式ドキュメントの Property Substitution が分かりやすいです。

${sys:PROPERTY_NAME} で参照できる log4j がらみのシステムプロパティ一覧はこちら。

ちなみにシステムプロパティは、先のJavaコードのように System.setProperty 関数で任意の値を渡す用途にも使えます。

あと、参考までに、設定ファイルを動的に再読込するコードも書いておきます。

org.apache.logging.log4j.core.LoggerContext ctx = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
ctx.reconfigure();

※この記事は、log4j 2.8.2 を想定しています。

関連情報:

Hatena Pocket Line

コメントを記入