こんにちは。サイオステクノロジー OSS サポート担当 山本 です。
此度は systemd 環境のログファイル /var/log/messages について見ていこうと思います。
今回はこのログファイルに関連する要素の片割れ、journald (systemd-journald) について確認します。
■journald って?
journald (正しくは systemd-journald) は、その名のとおり systemd の journal (記録) を担当する daemon、ざっくり言ってしまえばログをとってくれるヤツです。
これは systemd の補助コンポーネントの一つで、基本的に systemd と一緒に導入されます。
systemd についても軽く触れておくと、これはシステム全体の管理を担う超重要なソフトウェア群で、例えば RHEL (Red Hat Enterprise Linux) や Debian、Ubuntu などでデフォルトのシステム管理ソフトウェアとして採用されています。
systemd は主にシステムの起動後に最初のプロセスとして起動され、/usr/lib/systemd/system/ 配下などにある “~.service” や “~.target” などのような unit ファイルを元に、システムの初期化やデバイス管理、サービスの管理など様々な役割を果たすものです。
サービスの起動停止や状態確認などに使われる “systemctl” も、この systemd のものです。
journald の役割は先述のとおりロギングで、例えば
・kernel のログ (kmsg)
・監査ログ (audit)
・systemd の unit の各種出力
・libc の syslog 呼び出しによるログ
・journal API (sd_journal_print) のログ
などを記録します。
■journald のログを見てみる
RHEL9 を例にして見てみましょう。
RHEL9 では journald は systemd パッケージの中に含まれています。
先述のとおり、RHEL9 はデフォルトのシステム管理に systemd を使用するので、デフォルトで systemd がインストールされています。
そのため、特に意識しなくてもデフォルトで journald を使用する状態になっています。
さて、journald のログの所在ですが…基本的には /run/log/journal/ 配下に作成されたディレクトリ内にあるはずです。
/var/log/journal/ 配下にある場合もあります。
ただ、このファイルはバイナリファイル (ログに関する様々な追加情報を含む) であるため、例えば cat コマンドなどでテキストとして表示しても普通の人間には読むことはまずできません。
journalctl という journald のログを確認するためのコマンドがあるので、 journald のログを確認するにはこちらを使いましょう。
実際に journalctl で表示してみた一例としては、以下のような形になります。
[ ~]# journalctl -n 10 -o short-full --no-pager --no-hostname Tue 2023-06-13 06:49:50 UTC systemd[1]: Starting The Apache HTTP Server... Tue 2023-06-13 06:49:50 UTC systemd[1]: Started The Apache HTTP Server. Tue 2023-06-13 06:49:50 UTC sudo[3449]: pam_unix(sudo:session): session closed for user root Tue 2023-06-13 06:49:50 UTC httpd[3455]: Server configured, listening on: port 80 Tue 2023-06-13 06:49:56 UTC sudo[3672]: user1 : TTY=pts/0 ; PWD=/home/user1 ; USER=root ; COMMAND=/bin/su - Tue 2023-06-13 06:49:56 UTC sudo[3672]: pam_unix(sudo:session): session opened for user root(uid=0) by user1(uid=1000) Tue 2023-06-13 06:49:56 UTC su[3674]: (to root) root on pts/0 Tue 2023-06-13 06:49:56 UTC su[3674]: pam_unix(su-l:session): session opened for user root(uid=0) by user1(uid=0) Tue 2023-06-13 06:49:56 UTC systemd[1]: Starting Hostname Service... Tue 2023-06-13 06:49:56 UTC systemd[1]: Started Hostname Service. [ ~]#
■journalctl について
journalctl は特にオプションを指定しない場合、読み込めた journald のログを先頭から全て表示します。
表示は基本的に pager 形式になります。(less コマンドなどで使用される、カーソルキーなどで表示範囲を変更したりできる形式。表示を終了するには “q” キー)
実際にログを見ていくには全表示だけでは不便なので、ここでいくつか絞り込みの方法を見ていきたいと思います。
■表示行数の制限:-n、-e
該当するログのうち、新しいほうから最大で指定した行数のみを取得します。
例えば、最新の 200行のみ取得したいなら以下のようにします。
$ journalctl -n 200
(このオプションに限らずですが) 他のオプションとの組み合わせも可能で、その場合は条件に合致するログを新しいほうから指定行数だけ取得してくれます。
一方 “-e” オプションを指定すると、表示される pager の初期カーソル位置が最終行 (最新データの行) になります。
また、先述の “-n” オプションを同時に使用していない場合、取得行数が 1000行になります。
$ journalctl -e
一応の留意点として、”-e” を “-n” と同時に使用した場合、”-n” で指定した行数を無視して 1000行分の取得になる場合がある、とされています。
簡単に試す感じではちゃんと “-n” での制限が有効に見えるため、場合によるもののようです。
■unit の指定:-u
特定の unit のログのみを取得します。
例えば、unit “httpd.service” のログを取得したい場合、以下のようにします。
$ journalctl -u httpd.service
“~.service” unit の場合、”.service” の部分を省略してもうまくいきます。
■期間の指定:–since、–until
指定した期間のログのみを取得します。
例えば、2023/06/13 06:45:00 から 2023/06/13 07:00:00 の間のログのみを取得したい場合、以下のようにします。
$ journalctl --since "2023-06-13 06:45:00" --until "2023-06-13 07:00:00"
“–since” には “-S”、”–until” には “-U” という短縮表記もできます。
■”ファシリティ” の指定:–facility
journald の各ログには “ファシリティ“…敢えて言い換えるなら区分・カテゴリなどが近いでしょうか…という情報が付与されています。
このファシリティが指定したものと一致するもののみを取得します。
例えば、典型的なファシリティの一つである “kern (kernel 関連)” のログを取得するなら、以下のようにします。
$ journalctl --facility=kern
なお以下のコマンドで、その環境で journald が使用する可能性のあるファシリティの一覧を確認できます。
$ journalctl --facility=help
■”プライオリティ” の指定:-p
journald の各ログには “プライオリティ“…敢えて言い換えるなら優先度でしょうか…という情報も付与されています。
このプライオリティが指定したものより重大度が高いもののみを取得します。
例えば、プライオリティが “warning” (警告) 以上のログを取得するなら、以下のようにします。
$ journalctl -p warning
なお、指定できるプライオリティは重大度が高い順に以下です。
(名前の代わりに併記している数値で指定することもできます。)
・”emerg” (0)
・”alert” (1)
・”crit” (2)
・”err” (3)
・”warning” (4)
・”notice” (5)
・”info” (6)
・”debug” (7)
■標準出力に出力:–no-pager
ログを pager 形式で表示する代わりに、コンソール上の標準出力に出力します。
これは例えば、リダイレクトで journald の特定のログをファイルに書き出す場合などに使える可能性があります。
例えば、「ファシリティ kern」「プライオリティ err 以上」「最新 200行」のログを “/tmp/test_journal_log.txt” に記録するなら、以下のようにします。
$ journalctl --facility=kern -p err -n 200 --no-pager > /tmp/test_journal_log.txt
■ディスク使用量のチェック:–disk-usage
journald のログによるディスク使用量を表示することができます。(ログは出力されません)
例えば、以下のように表示されます。
$ journalctl --disk-usage Archived and active journals take up 8.8M in the file system.
■journald のログの揮発性
先述のとおり、journald のログは基本的に /run/log/journal/ 配下のディレクトリに保存されます。
…ところで /run/ ディレクトリというのは、システムの起動時の一番最初に初期化することが定められている、所謂一時ディレクトリです。
言い換えれば、/run/ ディレクトリ配下の情報はシステムの再起動の際に全て消失します。
勿論これは、/run/log/journal/ 配下の journald のログも例外ではありません。
そのため、journald のログはデフォルトでは永続的に保存されません。
この性質は、journald のログを使う際には留意しておきましょう。
■最後に
今回は systemd-journald についてざっくりとお話ししてみました。
…あれ、/var/log/messages の話をするんじゃなかったのか?/var/log/messages 出てきてなくないか?
というツッコミもあるかと思いますが、これはまた次回に…
関連する他の回:
/var/log/messages を知りたい:rsyslog 編
journald のログを永続化したい
ログ “Suppressed X messages” とログの抑制について (journald)
Short Tips:journald のログ抑制の設定 おまけ
ログ “X messages lost due to rate-limiting” とログの抑制について (rsyslog)
rsyslog のログフォーマットを変更する
journald をログファイルに記録させずに rsyslog のログファイルに記録する