journalctl とは
jounarld.service が記録してくれているログをみるためのコマンド。
Linux でアプリケーションを動かす場合は、systemd に登録し、journalctl でログを見るというのがベストプラクティスになっている。
新しいもの順に表示するようにする
journalctl -r
最新のログをフォローする場合は、
journalctl -f
起動してからのものを取得する場合 (boot) は、
journalctl -b
特定の時間から調べる
障害が起きた特定の時間からのログを調べたいということがある。
journalctl --since="2020-10-13 22:15:00"
# もちろん、until もある
journalctl --until="2020-10-14 22:15:00"
障害が起きた間のみのログに絞りたい場合は、
journalctl --since="2020-10-13 22:15:00" --until="2020-10-14 22:15:00"
何時間前などで絞りたい場合は、date コマンドと組み合わせると便利。
journalctl --since="$(date -d '12 hour ago' '+%Y-%m-%d %H:%M:%S')" --until="$(date -d '11 hour ago' '+%Y-%m-%d %H:%M:%S')"
複数の unit のログを見る
問題となっていそうな複数のコンポーネントにしぼってみる。
journalctl -u fluentd -u block-storage
カーネルのログを見るときは -k をつける。OS が突然死した、CPU の異常などが起きた場合はよく使う。
journalctl -k
エラーの種類でフィルターする
通常ログは見ずに、エラーレベルのものだけみたいという時がある。
journalctl -p 4 -xb
-x は追加情報、-b は起動してからのログ エラーレベルは下記の通り。
0 | emerg
1 | alert
2 | crit
3 | err
4 | warning
5 | notice
6 | debug
あまり使わないが、-p0..4
という指定方法ができる。
問題となっていそうなキーワードから絞る
2021/05/15 更新: journalctl のデフォルトの pager が less のため、&
でパターンを絞ることが可能。また、&!
でパターン否定でフィルタリングもできる。
&
を入力してから err
などでフィルタリングするととても便利(less すごい)
journalctl --grep "kube"
systemd が grep をサポートしてコンパイルされていないと下記のエラーが出る。
Compiled without pattern matching support
#890265 - systemd: journalctl compiled without pattern matching support - Debian Bug report logs
ファイルがローテートされた古いログを確認する
データサイズが大きくなると、ローテートされてしまうが保存されている fileから読める。
journalctl --file=/var/log/journal/hogehoge.log
ディレクトリ内の journal ログをまとめて見ることもできる。
journalctl -D /var/log/journal/b1eae0134
表示されるログが wrap されるようにする
そのまま journalctl だと、一行が長くて画面に収まらないことがある。
2021/05/15 更新: journalctl の pager がデフォルトだと less のため、-S
を入力することで wrap の on/off が可能。
参考:systemd - journalctl: how to prevent text from truncating in terminal - Unix & Linux Stack Exchange
journalctl -xn | less
# あるいはそもそも pager を利用しない手もある
journalctl --no-pager
デフォルトでは PAGER が less に設定されているため、これを例えば vim に変えたい場合は、
PAGER=vim journalctl
とできる。