syslog-ngをDocker上で動かす際の注意点と対処法
以前syslog-ngがDocker上で動かなくなったと書きました。
Dockerのセキュリティレベルが上がって syslog-ng が /proc/kmsg にアクセスできなくて動いてなかった - Humanity
で、肝心の動かなくなった原因について何も書いてなかったのですが、
原因は syslog-ng.conf 内の system() でした。
もっと詳しく言うと、system()と書くと /proc/kmsg にアクセスするためでした。
system() について
この system() とは、system-specific log messagesを表すようです。
Linuxだとこれは以下と同じみたいです*1。
unix-dgram("/dev/log");
6.10. Collecting the system-specific log messages of a platform - - The syslog-ng Open Source Edition 3.4 Administrator Guide
file("/proc/kmsg" program-override("kernel") flags(kernel));
/dev/log はsyslog(3)関数の書き込み先らしいです。
/proc/kmsg はカーネルのログなのでDockerのホスト側でsyslog-ng動かしておけば取れるはずです。
このファイルは、カーネルが生成したメッセージを保持するのに使用されます。
E.2.14. /proc/kmsg
これらのメッセージは、/sbin/klogd や /bin/dmesg などの別のプログラムによってピックアップされます。
対処法
/proc/kmsg からログを習得しなければいいだけです。
system() を unix-dgram("/dev/log"); で置換するだけです。
ぐだぐだ
対処法簡単な割に文章多いな、とか思うかもしれませんが、
前紹介したdocker-initscriptsにsyslog-ng integration機能を追加したので
それを紹介しようとしたのですが、力尽きたためです。