【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 を想定しています。
関連情報:
コメントを記入