log4j.propertiesで参照できるのはシステムプロパティであって、環境変数ではない

Log4Jでログファイル名やメールのSubjectに、
コンピュータ名や日付を埋め込む方法を調べた。

  • 結論

javaの-Dオプションで、環境変数システムプロパティに渡す。
そのシステムプロパティを、
log4j.propertiesで、${システムプロパティ名}の形式で参照する。

javaの-Dオプションの例

java -Dcomputername=%COMPUTERNAME% -Dtoday=%date:/=% -cp .;.\lib\log4j-1.2.16.jar Log4jEnvToy

log4j.propertiesの例

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p %c{1} - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender

#環境変数java.lang.System.getenv)は参照してくれない!
#log4j.appender.file.File=mylog-${COMPUTERNAME}-${%date:/=%}.log

#参照するのはシステムプロパティ(java.lang.System.getProperty)
#java -Dcomputername=%COMPUTERNAME% -Dtoday=%date:/=% -cp .;.\lib\log4j-1.2.16.jar Log4jEnvToy
log4j.appender.file.File=mylog-${computername}-${today}.log

log4j.appender.file.Append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %5p %c{1} - %m%n

log4j.rootLogger=info, stdout, file

実行例(コンソール)

C:\Users\hoshinom\Dropbox\java\log4jtoy>echo %COMPUTERNAME%
KITT

C:\Users\hoshinom\Dropbox\java\log4jtoy>echo %date:/=%
20111023

C:\Users\hoshinom\Dropbox\java\log4jtoy>java -Dcomputername=%COMPUTERNAME% -Dtoday=%date:/=% -cp .;.\lib\log4j-1.2.16.jar Log4jEnvToy
2011-10-23 13:26:35,610 INFO Log4jEnvToy - info log.
2011-10-23 13:26:35,615 WARN Log4jEnvToy - warn log.
2011-10-23 13:26:35,617 ERROR Log4jEnvToy - error log.
2011-10-23 13:26:35,620 FATAL Log4jEnvToy - fatal log.

C:\Users\hoshinom\Dropbox\java\log4jtoy>

実行例(mylog-KITT-20111023.log)

2011-10-23 13:26:35,610 INFO Log4jEnvToy - info log.
2011-10-23 13:26:35,615 WARN Log4jEnvToy - warn log.
2011-10-23 13:26:35,617 ERROR Log4jEnvToy - error log.
2011-10-23 13:26:35,620 FATAL Log4jEnvToy - fatal log.

  • 参考文献

バッチ・ファイル中で日付をファイル名に使用する
http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html

SystemクラスのJavadoc
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/System.html#getProperties()

Javaリソース・プロパティーメモ(Hishidama's Java resource/property Memo):
http://www.ne.jp/asahi/hishidama/home/tech/java/resource.html#h2_SystemProperty