Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 3 分

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

ジャーナルを見る

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

$ journalctl

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

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

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

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

※1
manページにも記載のとおりjournalctlには--grepというオプションがあるのですが,Ubuntuではコンパイル時にこのオプションは有効にされておらず,Compiled without pattern matching supportというメッセージが表示されます。
$ 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)⁠

※2
詳細はmanページをご確認ください。

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

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

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

※3
もちろん,MaxFileSize等の上限に当たっている場合は,古いものから消えていきます。最初から最後まで完全なものが残っているかは設定と状況次第です。

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

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

$ journalctl -b -1

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

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

お詫びと訂正(2018年11月19日)

本記事の公開時点では,/var/log/journalへのジャーナルの蓄積について,以下のように言及していました。

「UbuntuのデフォルトではStorage=autoですが,/var/log/journalディレクトリが存在しません。そのため,実際のデフォルトの挙動はStorage=volatileで,過去のジャーナルは保管されていません。」

しかしながら,その後の調査の結果,Ubuntuやsystemdのバージョンにより,デフォルトでのディレクトリの有無が異なることが判明しましたので,内容を訂正しました。

誤った内容を記載していたことを,お詫びいたします。

著者プロフィール

たなかあきら

Ubuntu Japanese Team Member。ちょっとお高い電子辞書を買ったので,楽しく翻訳をしていたところ,気づいたらメンバーになっていました。

コメント

コメントの記入