めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHEL7/CentOS7のjournaldについてのもろもろ

journaldとは?

systemdの環境で、標準的に提供されるログ管理のサービスです。正式名称は、下記の「systemd-journald.service」です。

# systemctl status systemd-journald.service
systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
   Active: active (running) since 月 2014-11-24 16:27:08 JST; 5 days ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 334 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─334 /usr/lib/systemd/systemd-journald

11月 24 16:27:08 server01 systemd-journal[334]: Runtime journal is using 8.0....
11月 24 16:27:08 server01 systemd-journal[334]: Runtime journal is using 8.0....
11月 24 16:27:08 server01 systemd-journal[334]: Journal started
11月 24 16:27:11 server01 systemd-journal[334]: Runtime journal is using 8.0....
Hint: Some lines were ellipsized, use -l to show in full.

RHEL7/CentOS7では、従来のrsyslogdも並行して稼働しています。

# systemctl status rsyslog.service
rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled)
   Active: active (running) since 月 2014-11-24 16:27:12 JST; 5 days ago
 Main PID: 526 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─526 /usr/sbin/rsyslogd -n

11月 24 16:27:12 server01 systemd[1]: Started System Logging Service.

Fedora20では、もはやrsyslogdは動いておらず、システムログ管理は、journaldに完全移行しています。(パッケージはあるので追加導入することは可能です。)

ちなみに、「systemdはひとつのバイナリーでなんでもかんでもやりやがって、Unixの伝統をなんだと思ってんだ」的な声を聞くこともありますが、journaldは、systemd本体とは別のバイナリーで動作する普通のデーモンです。独自のAPI(ライブラリ関数)を提供しており、systemd本体とは独立したコンポーネントです。(systemdのサービスとして起動する前提で作られてはいますが。)ひとつのバイナリーでなんでもかんでもやってるわけではありませんです。

journaldがログを保存する場所

RHEL7/CentOS7のデフォルトでは、「/var/run/log/journal」以下です。ここは、OSを再起動すると消える領域なので、journaldは、直近の起動後のログのみを保存していることになります。

永続的にログを保存したい場合は、ディレクトリー「/var/log/journal」を作って再起動します。このディレクトリーがあると、jounraldはこちらにログを保存します。

Fedora20では、最初から/var/log/journalが用意されています。

なお、「/var/run/log/jounral」「/var/log/journal」のどちらを使用する場合でも、無制限にログをためていくわけではありません。保存用ディレクトリーの全容量に対して10%以上になるか、該当ディレクトリーのファイルシステムの空き容量が15%以下になると、古いエントリーから順に削除されていきます。

保存容量を明示的に指定する場合は、設定ファイル/etc/systemd/journald.confの「SystemMaxUse」(/var/log/journalの場合)と「RuntimeMaxUse」(/var/run/log/journalの場合)に容量を指定します。詳細は、journald.conf(5)のmanページを参照してください。

journaldがログを収集する方法

・systemdのサービスとして起動したデーモンの標準出力/標準エラー出力の内容
・ローカルのプロセスがsyslogに出力したメッセージ(外部からのメッセージは収集しないはず)
・journald独自のAPI(ライブラリ関数)に対して出力したメッセージ

です。syslog宛のメッセージは、rsyslogdよりも先にjournaldが/dev/logから奪います。その後で、rsyslogdがimjournalモジュールを使って、journaldから受け取ります。

/etc/rsyslog.conf

$ModLoad imjournal # provides access to the systemd journal

また、journaldは、syslogメッセージを受け取ると、その内容をパースして、送信元のPIDを見つけて、該当PIDのプロセスの諸々の情報(メタデータ)を一緒に記録します。そのため、各メッセージについて、「どのサービスが出力したメッセージなのか」なども把握しています。

journaldが収集したログの確認方法

基本は次のとおり。

・すべてのログをlessにパイプして閲覧

# journalctl

・lessがいらないとき(-lをつけないと画面の右端でカットされる。)

# journalctl -l --no-pager

・特定サービスのログだけ見るとき

# journalctl -u hoge.service

・メタデータを含めて全部見たいとき

# journalctl -u hoge.service -o json-pretty

・tail -f コマンドっぽく、ログの新規出力を観察したいとき

# journalctl -f

その他のオプションは、manページか、下記の資料を参考にしてください。

Linux女子部 systemd徹底入門