Ubuntu Weekly Recipe

第545回systemdのログ「ジャーナル」見る・ためる

systemd環境では標準のログ収集・格納サービスとしてsystemd-journald(以下、journald)が稼働しています。今回は、このjournaldについて解説します。

ジャーナルを見る

早速ですが、journaldがためたログ=「ジャーナル」を確認してみましょう。ジャーナルを確認するためにはjournalctlコマンドを使います。

$ journalctl

ずらっと、文字列が表示されるはずです。特に変わったところもなく、人間が見て読みやすいログと思えるのではないでしょうか。

lessでジャーナルの内容が表示されていますので、通常通り矢印キーで上下させて内容を見ることができます。qを押すと、画面から抜けることができます。

-xをつけて実行すると、対応するメッセージカタログが存在すれば、追加の解説をつけてログを表示できます。追加の解説とは、たとえば、このエラーやログが記録されるのはどういうときか、これが記録されるときはどういう対処をしたら良いか、といったユーザーをサポートする情報です。

grepなどをしたい場合は、次のコマンドのように--no-pagerとつければlessを介さず、画面をログが流れていきます[1]⁠。

$ journalctl --no-pager | grep -e 'err'

オプションを使ってログを絞る

journalctlは確認したいユニット、時間、プライオリティを指定して出力が可能です。これらを絞ってログを見たいのであれば、grepで頑張る必要はないかもしれません。

ユニット単位で確認するときは-uを使います。このオプションはパターンも引数に取れます。

$ journalctl -u systemd-resolved.service

$ journalctl -u 'systemd*'

また、-kでカーネルのログを見ることができます。

ログを時間帯を絞るときは開始時刻を指定する-Sまたは終了時刻を指定する-Uもしくはその両方を使うで実現できます。

$ journalctl -S "2018-11-01 00:00:00" -U "2018-11-02 00:00:00"

プライオリティで絞るときは-pを使います。プライオリティ自体は数字もしくは文字で指定します。syslogと同じで、プライオリティの高い順から"emerg"(0⁠⁠、"alert"(1⁠⁠、"crit"(2⁠⁠、"err"(3⁠⁠、"warning"(4⁠⁠、"notice"(5⁠⁠、"info"(6⁠⁠、"debug"(7)となっています。

なお、単体指定の場合は、そのレベルを以上(そのレベルを含む)のログを表示します。範囲指定は、${FROM}..${TO}の形でおこない、両端を含む形で、その範囲に合致するログを抽出します。

$ journalctl -p 3       # "err"以上("emerg", "alert", "crit", "err"のログを表示する)

$ journalctl -p 3..4        # "err"〜"warning"を表示
$ journalctl -p err..warning        # 同上。別表現。

覚えておきたいオプション

-ftail -f /var/log/syslogのように何かを動かしながらログを見るときに便利です。

各オプションは矛盾しなければ併用できます。例えば次のコマンドは、systemd-resolved.serviceのログをリアルタイムで追いかけています。

$ journalctl -f -u systemd-resolved.service

-fの出力からはCtrl+Cで抜けることができます。

また、最新のログまで飛ぶ-eや順序を新しいものから並べる-rも覚えておくとよいでしょう。

ジャーナルをためる

journaldの設定は/etc/systemd/journald.confで変更できます。

初期状態では、ほぼすべてコメントアウトされていますが、ここでは [Journal] 以下を取り出してみます。

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K

すべての設定がコメントアウトされています。ファイルの冒頭に記載されているとおり、これらはコンパイル時にデフォルトで設定されている値です。

このうちStorage=は収集したログの保管先を指定するものです。

Storage=は収集したログの保管先を指定するものです。取れる値と挙動は次のとおりです。

挙動
volatile メモリ上/run/log/journal以下)でジャーナルを保管する。したがって、再起動等でジャーナルは失われる。
persistent ディスク上/var/log/journal以下)にログを保管する。ディレクトリがなければ作成する。
auto /var/log/journalディレクトリがなければvoltaileディレクトリがあればpersistentの挙動をする。デフォルト値。
none ジャーナルを保管しない。

UbuntuのデフォルトではStorage=autoですが、/var/log/journalディレクトリの存在の有無は利用しているUbuntuやsystemdのバージョンにより異なります。Ubuntu 18.04 LTS以降の場合はデフォルトで/var/log/journalディレクトリが存在しますので、過去のジャーナルが蓄積されるようになっています。

ジャーナルを残すときの設定のポイント

Storage=auto/var/log/journalディレクトリを作成したり、Storage=persistentに設定変更したりすることで、過去のジャーナルを残すことができます。

その際は、SystemMaxUse=SystemKeepFree=SystemMaxFileSize=SystemMaxFiles=RuntimeMaxUse=RuntimeKeepFree=RuntimeMaxFileSize=RuntimeMaxFiles=なども併せて設定しておくのがよいでしょう。というのも、ジャーナルが(限度はあるものの)たまり続け、思いのほか容量を取ってしまう可能性があるためです。

それぞれの設定について、軽く解説しておきます。

Systemから始まるものは、ディスク上/var/log/journalに書き込まれる量に対する制限です。一方、Runtimeから始まるものはメモリ上/run/log/journalに書き込まれる量を制限する設定です。

*MaxUse=はそれぞれの最大容量、*KeepFree=はディレクトリの容量をこれだけ空けておく、という制限です。*MaxFiles=はファイルの最大数、*MaxFileSize=は1ファイルあたりの最大サイズです[2]⁠。

ここで設定された制限により、ログが消えていきます。デフォルトでは、以下の条件のどちらかを満たすまで、ログがたまり続けます。

  • ジャーナルのサイズがファイルシステムの容量の10%もしくは4GBの小さいほうに到達する
  • ファイルシステムの空き容量が15%もしくは4GBの小さいほうに到達する

ログをディスク上に残していると、過去のブートからシャットダウンまでのログを見ることができます[3]⁠。

システムの起動単位でログを確認する

過去のシステム起動時のログをためる設定にしている場合、次のコマンドを実行すると、前回(1回前)のブートにしぼってジャーナルを確認できます。

$ journalctl -b -1

残る設定のうち、ForwardToSyslog=ForwardToKMsg=ForwardToConsole=ForwardToWall=はjournaldが受けっ取ったログをどこへ転送するかを設定するものです。rsyslogへのログの転送についての詳細は次回に解説します。

以上、今回はjournalctlの使い方やjournaldの設定から、ジャーナルの世界を覗いてみました。ごく簡単な内容ではありましたが、今回の内容をおさえていれば「あのサービスのこの時間帯のログを見る」といった操作には困らないでしょう。

おすすめ記事

記事・ニュース一覧