前回に引き続き、
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.
一方で、
逆に、