systemd環境では標準のログ収集・格納サービスとしてsystemd-journald(以下、journald)が稼働しています。今回は、このjournaldについて解説します。
ジャーナルを見る
早速ですが、journaldがためたログ=「ジャーナル」を確認してみましょう。ジャーナルを確認するためにはjournalctl
コマンドを使います。
ずらっと、文字列が表示されるはずです。特に変わったところもなく、人間が見て読みやすいログと思えるのではないでしょうか。
less
でジャーナルの内容が表示されていますので、通常通り矢印キーで上下させて内容を見ることができます。q
を押すと、画面から抜けることができます。
-x
をつけて実行すると、対応するメッセージカタログが存在すれば、追加の解説をつけてログを表示できます。追加の解説とは、たとえば、このエラーやログが記録されるのはどういうときか、これが記録されるときはどういう対処をしたら良いか、といったユーザーをサポートする情報です。
grep
などをしたい場合は、次のコマンドのように--no-pager
とつければless
を介さず、画面をログが流れていきます[1]。
オプションを使ってログを絞る
journalctl
は確認したいユニット、時間、プライオリティを指定して出力が可能です。これらを絞ってログを見たいのであれば、grep
で頑張る必要はないかもしれません。
ユニット単位で確認するときは-u
を使います。このオプションはパターンも引数に取れます。
また、-k
でカーネルのログを見ることができます。
ログを時間帯を絞るときは開始時刻を指定する-S
または終了時刻を指定する-U
、もしくはその両方を使うで実現できます。
プライオリティで絞るときは-p
を使います。プライオリティ自体は数字もしくは文字で指定します。syslog
と同じで、プライオリティの高い順から"emerg"(0)、"alert"(1)、"crit"(2)、"err"(3)、"warning"(4)、"notice"(5)、"info"(6)、"debug"(7)となっています。
なお、単体指定の場合は、そのレベルを以上(そのレベルを含む)のログを表示します。範囲指定は、${FROM}..${TO}
の形でおこない、両端を含む形で、その範囲に合致するログを抽出します。
覚えておきたいオプション
-f
はtail -f /var/log/syslog
のように何かを動かしながらログを見るときに便利です。
各オプションは矛盾しなければ併用できます。例えば次のコマンドは、systemd-resolved.serviceのログをリアルタイムで追いかけています。
-f
の出力からはCtrl+Cで抜けることができます。
また、最新のログまで飛ぶ-e
や順序を新しいものから並べる-r
も覚えておくとよいでしょう。
ジャーナルをためる
journaldの設定は/etc/systemd/journald.conf
で変更できます。
初期状態では、ほぼすべてコメントアウトされていますが、ここでは [Journal]
以下を取り出してみます。
すべての設定がコメントアウトされています。ファイルの冒頭に記載されているとおり、これらはコンパイル時にデフォルトで設定されている値です。
このうち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回前)のブートにしぼってジャーナルを確認できます。
残る設定のうち、ForwardToSyslog=
、ForwardToKMsg=
、ForwardToConsole=
、ForwardToWall=
はjournaldが受けっ取ったログをどこへ転送するかを設定するものです。rsyslogへのログの転送についての詳細は次回に解説します。
以上、今回はjournalctl
の使い方やjournaldの設定から、ジャーナルの世界を覗いてみました。ごく簡単な内容ではありましたが、今回の内容をおさえていれば「あのサービスのこの時間帯のログを見る」といった操作には困らないでしょう。