Linuxのログ管理journaldの基本設定とログの検索方法を解説

Linuxのログ管理journaldの基本設定とログの検索方法を解説。

RedHat系Linuxでは、バージョン7からそれ以前の「syslog」ベースでのログ管理から、新たなログ管理の仕組みとして「journald」が採用されています。

そこでここではRedHat系のAlmaLinuxを例に、journaldの基本的な設定項目やjournaldによって収集されたログをjournalctlコマンドを使って検索する方法を解説します。

journaldとは

RedHat系のLinuxでは、RHEL7系からログ管理の仕組みとしてjournaldが採用されています。journaldでは、システム上で発生するさまざまイベント(カーネル関連のイベント、プロセス関連のイベント、サービス関連のイベント)が収集され、専用のデータベース記録されます。

Journaldによって収集・記録されたログは、さらにrsyslogによってログの種類や重要度などによって分類され「/var/log」ディレクトリ配下のログファイルに記録されます。

なお、journaldによってデータベースに記録されているログデータは、/var/log配下に保存されているようなテキスト形式ではなくバイナリ形式のため、参照する際は専用コマンド「journalctl」を使う必要があります。

また、ログが記録されているデータベースはデフォルトで「/run/log/journal」ディレクトリ配下に格納されていますが、「/run」ディレクトリはtmpfsにマウントされており、OSを再起動するとすべて削除されます。

ログの永続化

journaldによって収集されたログが記録されているデータベースは、デフォルト「/run/log/journal」ディレクトリ配下に格納されていますが、「/run」ディレクトリはtmpfsにマウントされており、OSを再起動するとすべて削除されてしまいます。

OSを再起動してもログが残るよう永続化したいときは、以下のいずれかを設定します。

  • 設定ファイル「/etc/systemd/journald.conf」で「Storage=persistent」を指定
  • 「/var/log/journal」ディレクトリを作成

どちらを設定しても結果は同じですが、設定ファイルを編集する場合は、journaldの設定ファイル「/etc/systemd/journald.conf」を開き「Storage=」に「persistent」を指定し、行頭のコメントアウト「#」を削除します。

# vi /etc/systemd/journald.conf
[Journal]
Storage=persistent
...

設定ファイルを保存したら、journaldサービスを再起動します。

# systemctl restart systemd-journald

以上で、「/var/log/journal」配下のディレクトリにログが出力されるようになります。

# ls /var/log/journal/
7a6f961156e443bea2d16fcf3353b824
# ls -l /var/log/journal/7a6f961156e443bea2d16fcf3353b824/
合計 8196
-rw-r----- 1 root root 8388608 2月 24 00:42 system.journal

ディレクトリ名には、machine-idが自動的に付けられます。

ログサイズの制限

journaldでは、ログを永続保存するよう設定した場合、既定のログ容量としてログを保存しているディレクトリがマウントされているファイルシステムの10%が割り当てられますが、固定サイズで指定することもできます。

ログファイルのサイズを固定で指定するときは、journaldの設定ファイル「/etc/systemd/journald.conf」を開き「SystemMaxUse=」にログファイルのサイズを指定します。

たとえば、ログファイルのサイズを2GBに制限したいときは、以下のように記述します。

# vi /etc/systemd/journald.conf
[Journal]
...
SystemMaxUse=2G
...

設定ファイルを保存したら、journaldサービスを再起動します。

# systemctl restart systemd-journald

以上で、ログの最大容量が指定したサイズに制限されます。(以下では「max allowed 2.0G」と表示されていることから、2GBに制限されていることが分かります。)

# journalctl -u systemd-journald -l
...
2月 24 00:56:11 cent74.local systemd-journal[17546]: Permanent journal is using 8.0M (max allowed 2.0G, trying to leave 4.0G free of 43.7G available → current li
2月 24 00:56:11 cent74.local systemd-journal[17546]: Journal started

なお、ログを永続化していない場合は「RunMaxUse」にログサイズを設定することで、ログのサイズを固定化できます。

ログの検索方法

journaldにより収集されたログデータはバイナリ形式のため、収集されたログを検索・閲覧する際は、journalctlコマンドを使用する必要があります。

以下では、journalctlでログを確認する時の使用例を紹介します。

すべてのログを表示する

オプションなしで実行した場合は、古いログから表示されます。

# journalctl

逆に最新のログから表示したいときは「-r」オプションを付けて実行します。

# journalctl -r

最新のログを表示する

最新のログを表示したいときは「-e」オプションを付けて実行し、詳細なログを表示したいときは「-x」オプションを追加します。

# journalctl -e
# journalctl -ex

ログの表示が見切れないようにする

journalctlコマンドでは、デフォルトのページャーがlessになっており、画面に収まりきらない長いログなどは画面端で見切れてしまいます。

ログが見切れないようにしたいときは「--no-pager」オプションを付けることで、catによる表示となり、ログが画面右端で折り返して表示されるようになります。

# journalctl --no-pager

ただ、上のコマンドの場合、ログが一気に流れるので、ログを確認するのは困難です。その場合は、次のようにパイプでlessに渡すことで、ログが見切れることもなくページごとで表示できます。

# journalctl --no-pager | less

最新のログから指定した行数分のみを表示する

最新のログから指定した行数分を表示したいときは「-n」オプションを利用します。下の例では、最新のログを100行分表示します。

# journalctl -n 100

オプションのパラメーターを指定せずに実行した場合は、最新のログが10行分表示されます。

# journalctl -n

最新のログをモニターしたいとき

最新のログをリアルタイムでモニターしたいときは、tailコマンドのように「-f」オプションを利用します。

# journalctl -f

カーネルログのみを表示する

カーネルに関連するログのみを表示するには「-k」オプションを利用します。

# journalctl -k

ブートログのみを表示する

OS起動時のブートログを確認したいときは「-b」オプションを利用します。ハードウェアの認識状態などを確認したいときに便利です。

# journalctl -b

パラメーターに「1」を指定した場合は、ログに記録されている一番古いブートログを確認できます。

# journalctl -b 1

パラメーターに「-2」を指定した場合は、最新の二つ前のブートログを確認できます。

# journalctl -b -2

特定サービスのログのみを表示する

特定のサービスに関するログだけを表示したいときは「-u」オプションを利用します。下の例では「sshd」に関するログだけを表示します。

# journalctl -u sshd

また、実行ファイルのパスを指定してログを絞り込むこともできます。たとえば「/usr/sbin/crond」に関連するログだけを表示したいときは、以下のようにコマンドを実行します。

# journalctl /usr/sbin/crond

特定のプロセスIDのログのみを表示する

特定のプロセスIDのログのみを表示するするときは「_PID=プロセスID」と指定して実行します。例えば、プロセスIDが11111のログのみを表示したいときは、以下のようにコマンドを実行します。

# journalctl _PID=11111

特定の重要度以上のログのみを表示する

特定の重要度以上のログのみを表示するときは「-p」オプションを利用します。オプションのパラメーターには、以下の一覧にある文字列、もしくは数値を指定します。

ログの重要度一覧

数値文字列
emerg0
alert1
crit2
err3
warning4
notice5
info6
debug7

下の例では、いずれの場合も、エラー以上のログのみを表示します。

# journalctl -p err
# journalctl -p 3

「エラー以上のログ」とは、エラーログとエラーより重要なログ(crit, alert, emerg)という意味です。

特定の時間範囲のログのみを表示する

指定した日時以降のログを表示したいときは「-S」オプションを利用し、指定した日時までのログを表示したいときは「-U」オプションを利用します。

日時は、以下のような指定が可能です。

  • YYYY-MM-DD hh:mm:ss(時刻を省略した場合「00:00:00」とみなされます)
  • now, yesterday, today, tomorrow
  • 1 day ago, 3 hours ago …
  • -1h30min, +30min …

次のように入力すると、2019年2月10日17時以降のログが表示されます。

# journalctl -S "2019-02-10 17:00:00"

次のように入力すると、昨日からのログが表示されます。

# journalctl -S yesterday

次のように入力すると、2019年2月1日0時15分までのログが表示されます。

# journalctl -U "2019-02-01 00:15:00"

次のように入力すると、2019年2月1日0時から2019年2月5日0時までのログが表示されます。

# journalctl -S "2019-02-01" -U "2019-02-05"

次のように入力すると、2019年2月11日23時から1時間前までのログが表示されます。

# journalctl -S "2019-02-11 23:00" -U "1 hour ago"
# journalctl -S "2019-02-11 23:00" -U -1h