Log4j + syslog の設定
Log4j を syslog へ転送する時はファシリティと Syslog サーバが指定できる。log4j.xml の <appender> → <param> 指定は該当する Appender クラスのプロパティ名と同じなので、詳しくは API リファレンスの setter を参照。
SyslogAppender (Apache Log4j 1.2.17 API)
例えば
- <param name="facility" value="local4"/> … ファシリティ local4 を使用
- <param name="facilityPrinting" value="false"/> … ファシリティを出力しない
- <param name="header" value="false"/> … タイムスタンプとホスト名を出力しない
など。
タグを指定するプロパティは存在しないが、これはケースバイケースで対応可能。
- 固定値で良い場合
- PatternLayout 上で直接指定 ("[myapp] %m%n")
- プロセスごとに変えたい場合
- 起動時のシステムプロパティで指定 ("[${syslog.tag}] %m%n"、起動オプションに -Dsyslog.tag=myapp 追加)
- スレッドごとに変えたい場合
- アプリケーションから NDC や MDC で指定 ("[%X{tag}] %m%n"、アプリ内でスレッド開始時に MDC.put("tag", "myapp"); 追加)
- 出力ごとに変えたい場合
- アプリで出力するたびにフォーマット (logger.info("[" + myapp + "] ...") )
コードは通常の Log4j と変わらず。設定ファイルも概ね以下のようなイメージで構成できる。
import org.apache.log4j.*; public class A{ public static void main(String[] args){ Logger logger = Logger.getLogger("org.koiroha.myapp"); logger.info("hello, world"); return; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="syslog" class="org.apache.log4j.net.SyslogAppender"> <param name="threshold" value="info"/> <param name="syslogHost" value="localhost"/> <param name="facility" value="user"/> <layout class="org.apache.log4j.PatternLayout"> <param name="conversionPattern" value="${org.koiroha.appname} %m%n"/> </layout> </appender> <root> <priority value ="info"/> <appender-ref ref="syslog"/> </root> </log4j:configuration>
$ java -Dlog4j.configuration=log4j.xml -Dorg.koiroha.appname=sample1 A 2012-02-29 16:30:37,425 INFO myapp- [sample1] hello, world $ java -Dlog4j.configuration=log4j.xml -Dorg.koiroha.appname=sample2 A 2012-02-29 16:30:41,633 INFO myapp- [sample2] hello, world
ただし 1024 バイト以上のメッセージとなる場合は 2 以上のパケットに分割されるため、2つめ以降にタグは付けられない。