【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 を想定しています。
関連情報: