syslogにアプリログをlog4jを使って送信する
syslogにJavaのlog4jでログを送信するためのメモです。
環境
$ 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にログを出力する方法についてまとめました。
急がば回れの精神で、エラーが発生した一部分だけを理解するのではなく、全体の動作原理を理解しながら進めるのが解決への近道です。(あまり出来てないけど・・・)