Humanity

Edit the world by your favorite way

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");
file("/proc/kmsg" program-override("kernel") flags(kernel));

6.10. Collecting the system-specific log messages of a platform - - The syslog-ng Open Source Edition 3.4 Administrator Guide

/dev/log はsyslog(3)関数の書き込み先らしいです。
/proc/kmsg はカーネルのログなのでDockerのホスト側でsyslog-ng動かしておけば取れるはずです。

このファイルは、カーネルが生成したメッセージを保持するのに使用されます。
これらのメッセージは、/sbin/klogd や /bin/dmesg などの別のプログラムによってピックアップされます。

E.2.14. /proc/kmsg

対処法

/proc/kmsg からログを習得しなければいいだけです。
system() を unix-dgram("/dev/log"); で置換するだけです。

ぐだぐだ

対処法簡単な割に文章多いな、とか思うかもしれませんが、
前紹介したdocker-initscriptsにsyslog-ng integration機能を追加したので
それを紹介しようとしたのですが、力尽きたためです。

*1:リンク先はLinux以外の実装についても書かれています。