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つめ以降にタグは付けられない。