LoginSignup
14
15

More than 5 years have passed since last update.

Log4j2でsyslogに出力

Posted at

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で調べると良いです。

pom.xml
<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"を以下のように作成します。

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"にあるので、これを以下のように編集します。

rsyslog.conf(修正前)
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
rsyslog.conf(修正後)
# 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にも出力するように設定を追加します。

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>
        <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"にも以下のように出力されていれば成功です。

syslog
Feb  5 12:14:29 localhost  raspberrypi info

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
15