Log4j2でsyslogに出力

Updated: / Reading time: 2 minutes

Apache Log4j 2を使ってsyslogにログを出力する設定手順をメモします。

前提

  • 作業環境はWindowsでEclipse+Maven 2です。Mavenが使えればOSやIDEは何でも良いです。
  • 動作環境はRaspbianです。他のLinuxでも同様のはずです。
$ cat /etc/issue
Raspbian GNU/Linux 7 \n \l
$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)

Log4j2を使えるように設定

プロジェクトを作成します。Eclipseで”Maven Project”を作成するか、mvn archetype:createを実行します。

“pom.xml”に依存関係を追加します。具体的なバージョンは、Maven Repository: Search/Browse/Exploreで調べると良いです。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.1</version>
</dependency>

“/src/main/resources/log4j2.xml”を以下のように作成します。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyy/MM/dd HH:mm:ss.SSS} %-5level - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

適当なjavaファイルを作成し、以下のように記述します。

private static final Logger L = LogManager.getLogger(Main.class);

public static void main(String[] args) {
    L.info("info");
}

実行します。コンソールに以下のように出力されたら、設定は成功です。

2015/02/05 12:32:40.179 INFO  - info

514/udpでログを受信できるようにrsyslogを設定

Raspbianはrsyslogが動作していますが、udp・tcpともに受信できるように設定されていません。これを設定し、rsyslogを再起動します。

rsyslogの設定は”/etc/rsyslog.conf”にあるので、これを以下のように編集します。

# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

rsyslogを再起動します。

$ sudo service rsyslog restart

“/var/log/syslog”を見て、エラーが出力されていなければ成功です。

Log4j2からsyslogに出力するように設定

先ほどの”log4j2.xml”は標準出力にログを出力するように設定しました。ここに、syslogにも出力するように設定を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyy/MM/dd HH:mm:ss.SSS} %-5level - %msg%n" />
        </Console>
        <Syslog name="syslog" host="localhost" port="514" protocol="UDP" />
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="console" />
            <AppenderRef ref="syslog" />
        </Root>
    </Loggers>
</Configuration>

実行します。コンソールに先ほどのように出力され、”/var/log/syslog”にも以下のように出力されていれば成功です。

Feb  5 12:14:29 localhost  raspberrypi info

出力されていない場合、以下の点が原因かもしれません。

  • rsyslogが起動していない。
    • chkconfig --listなどでrsyslogが起動しているか確認する。
  • “rsyslog.conf”の設定が間違えている。
    • “/var/log/syslog”にエラーが出力されていないか確認する。
    • “rsyslog.conf”の設定を見直す。
  • 514番ポートが他のアプリで使われてしまっている。
    • netstat -anなどでポート番号の使用状況を確認する。