自分用にまとめます。
ログ転送概観
ログはおおむね /var/log/messages
で見れる。
何かあったらまずは messages をみよう。
RHEL7(CentOS7)以降のログ転送の構成は以下
カーネル(printk(9)) -> /dev/kmsg -> systemd-journald -> rsyslog --+--> /var/log/messages
↑ +--> /var/log/cron.log
ユーザApp(syslog(3),logger(1)) -> /dev/log ---+ +--> etc.
上記ですべてではなく、ほかにもログの経路は存在する。
syslog の仕組みを介さず、アプリケーション独自で採取しているログは上記の構成に則らない。
※たとえば httpd のアクセスログ(/var/log/httpd/access_log)など
printk(9)
カーネル関数。もちろんカーネル内、もしくはカーネルモジュール内でしか使えない。
カーネルがログを出力する際に利用される関数で、実態としては /dev/kmsg に書き込みを行う関数。
引数に与えるログ文字列の先頭に”<¥d>”と記述することでログレベルを指定できる。
printk() によって出力されたカーネルログは journald や rsyslog に渡されるとともに、dmesg コマンドなどでも確認できる。
syslog(3)
libc ライブラリ関数。同名のシステムコール syslog(2) とは全く異なるもの。
ユーザ空間のアプリケーションがログを出力する際に利用されら関数で、実態としては /dev/log に書き込む関数。
openlog() でファシリティ、プログラム名を指定してログを開き、syslog() でプライオリティを指定してログ出力、closelog() でログを閉じる。なお、glibc では、ファシリティに kern を指定すると勝手にファシリティが user に置き換えられるようになっており、カーネルログを吐けないようになっている。
logger(1)
標準コマンド。実態としては /dev/log に書き込む。
rsyslog
rsyslog は従来のログ集計・転送アプリケーション。
rsyslog のログ飛ばし先設定は /etc/rsyslog.conf
に記載あり。
以下は rsyslog-8.24.0-16.el7_5.4 インストール直後の設定内容。
mail、authpriv、cron以外のファシリティの、info 以上のプライオリティを持つログを /var/log/messages
に出力する、というような内容が読み取れる。
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
systemd-journald
RHEL7(CentOS)以降で導入されたログ集計アプリケーション。
rsyslog なしで、journald だけ運用することもできる。
/dev/log 、/dev/kmsg その他諸々からログを一括に収集する。
rsyslog は単にテキストベースでログを集計、分類、転送していたが、journald はログを吐いたプロセスやプライオリティなどをメタデータとして保有している。
そのため、journaldにはjournalctlコマンドによる高度なログ検索機能があり、rsyslogのようなログファイル分割機能はそもそも必要とされず、存在しない。