前回に引き続き、
journaldによるログの受信とrsyslogへの転送
systemd環境ではjournaldがシステムやサービスのログを一手に集めています。一方で、
詳しくは後述しますが、
たとえば、/dev/
を通じてカーネルログを集めていますし、/dev/
より従来のsyslog宛てのログも集めています。もちろん、
標準出力・標準エラー出力からのログの記録を確かめる
筆者がすこし変わっていると思うのは、
簡単に検証してみます。以下のような、journald-stdout-verify.
とします。
#!/bin/bash
echo "Standard Output"
echo "Standard Error" >&2
一時的なユニット生成・systemd-run
コマンド
$ sudo systemd-run ./journald-stdout-verify.sh
Running as unit: run-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
と表示されます。
このサービスのジャーナルを見ると、
$ journalctl -u run-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.service [...] [...] systemd[X]: Started /home/xxxx/xxxx/./journald-stdout-verify.sh. [...] journald-stdout-verify.sh[XXXX]: Standard Output [...] journald-stdout-verify.sh[XXXX]: Standard Error
標準出力・標準エラー出力のrsyslogへの転送
Ubuntuではjournaldとrsyslogとのどちらもが動いていますが、
そして、/etc/
の設定がForwardToSyslog=yes
でMaxLevelSyslog=debug
になっているからです。
systemdの場合はデフォルトで、
$ grep journald-stdout-verify /var/log/syslog [...] systemd[1]: Started /home/xxxx/xxxx/./journald-stdout-verify.sh. [...] journald-stdout-verify.sh[xxxx]: Standard Output [...] journald-stdout-verify.sh[xxxx]: Standard Error
しかしSysV系initの場合は、/dev/
につないでいるため、
このような挙動から、
どこで収集されたログかを確認する
各ログについてjournaldがどこから収集したものかは、_TRANSPORT=
フィールドで確認できます。
_TRANSPORT=
フィールドを確認するためには、-o verbose
を付与してjournalctl
を実行します。以下は、journald-stdout-verify.
を実行したときのログの例です。
$ journalctl -u run-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.service --no-pager -o verbose [...] # サービス開始メッセージ(ジャーナルに向けて出力) _TRANSPORT=journal [...] MESSAGE=Started /home/xxxx/xxxx/./journald-stdout-verify.sh. [...] # 標準出力 _TRANSPORT=stdout [...] MESSAGE=Standard Output [...] # 標準エラー出力 _TRANSPORT=stdout [...] MESSAGE=Standard Error
_TRANSPORT=stdout
となっているとおり、
なお、syslog()
、printf()
、sd_
と、
フィールド
話の流れで先に_TRANSPORT=
フィールドを取り上げましたが、
フィールドには大きく分けて2種類、
ユーザージャーナルフィールドはサービスなどが報告してきた情報が記録されるフィールドです。メッセージ本文を示すMESSAGE=
や文字通りプライオリティを示すPRIORITY=
、SYSLOG_
、SYSLOG_
、SYSLOG_
などです。
ちなみにjournald-stdout-verify.
からの標準出力を記録したログでは、PRIORITY=6
一方、_
が付与されています。特徴として、
たとえば、_PID
や実行ユーザーのID_UID
などがあります。先ほどの_TRANSPORT
も先頭に_
があり、
なお、_BOOT_
は次項各カーネルの起動ごとに割り振られるランダムなIDです。これで、
ブートごとのIDは--list-boots
オプションを付けることで確認できます。
$ journalctl --list-boots
ジャーナルを残す設定の場合、-b
は${_BOOT_
という形式を取ることも可能です。これにより、
ログは誰の手に?
一部ではありますが、
journald.
一方で、
逆に、