yanom blog

様々な技術について書きます

syslogにアプリログをlog4jを使って送信する

syslogにJavalog4jでログを送信するためのメモです。

環境

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.4 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.4 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

rsyslogの起動確認

まずは、rsyslogが動いているか確認します。

$ sudo /etc/init.d/rsyslog status
● rsyslog.service - System Logging Service
   Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 月 2019-01-21 18:58:57 JST; 7min ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 4836 (rsyslogd)
    Tasks: 5
   Memory: 1.5M
      CPU: 142ms
   CGroup: /system.slice/rsyslog.service
           └─4836 /usr/sbin/rsyslogd -n

 1月 21 18:58:57  systemd[1]: Starting System Logging Service...
 1月 21 18:58:57  systemd[1]: Started System Logging Service.

動いてますね。
動いてない場合は$ sudo /etc/init.d/rsyslog startすればいいと思います。

ポート確認

log4jでログを送信するためのポート(デフォルト514)が開いているか確認します。
デフォルトでは開いていない?ようなので、その場合は次の設定変更を行ってください。

sudo netstat -an | grep -i udp | grep 514
udp        0      0 0.0.0.0:514             0.0.0.0:*
udp6       0      0 :::514                  :::*

こうなっていれば、ポートは開いています。

rsyslogの設定変更

ここが 重要 で、私の環境では初めポート514が開いておらず、log4jを動かしても期待通りファイルに出力されずハマりました。。

$ vim /etc/rsyslog.conf

# provides UDP syslog reception
# 以下のコメントアウトを外す
module(load="imudp")
input(type="imudp" port="514")

以下は、rsyslogのファシリティとどのファイルに出力するかを設定しています。

$ vim /etc/rsyslog.d/testsyslog.conf

local0.*    /var/log/testsyslog.log

再起動

設定変更が終わったら、rsyslogを再起動します。

sudo /etc/init.d/rsyslog restart
[ ok ] Restarting rsyslog (via systemctl): rsyslog.service.

Javaアプリ

// 以下のような形で読み込んで
private static final Logger log = Logger.getLogger(AppTest.class);
// 中略

// 以下で出力しています。
log.info("it is test log");

log4j.propertiesは以下です。

# log messages to rsyslog
log4j.appender.syslog=org.apache.log4j.net.SyslogAppender

log4j.appender.syslog.SyslogHost=localhost
log4j.appender.syslog.Facility=local0
log4j.appender.syslog.FacilityPrinting=true
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1} - %m%n

確認

実際にJavaアプリを動かしてみると・・・

vim /var/log/testsyslog.log

Jan 21 18:52:23 localhost local0: 2019-01-21 18:52:23.401  INFO AppTest - it is test log

指定したファイルにログが出力されていました!

まとめ

log4jでsyslogにログを出力する方法についてまとめました。
急がば回れの精神で、エラーが発生した一部分だけを理解するのではなく、全体の動作原理を理解しながら進めるのが解決への近道です。(あまり出来てないけど・・・)