2026年7月16日
2026年7月16日
journalctlでsystemdのログを確認する方法|サービス・期間・優先度での絞り込みと容量管理
journalctl は、systemd のログ収集サービス(systemd-journald)が保存したログ(ジャーナル)を読むコマンドです。サービスの起動失敗、エラーの発生時刻、再起動前に何が起きていたかなどを、サービス単位・時間・重要度で絞り込んで確認できます。
この記事のオプションは、systemd の公式マニュアル(journalctl(1)、journald.conf(5))で2026年10月時点の内容を確認しています。Debian / Ubuntu、RHEL 系(AlmaLinux・Rocky Linux)など、systemd を使う現行のディストリビューションで同じように使えます。
ログを読むための権限
システム全体のログを読めるのは、root と、systemd-journal・adm・wheel のいずれかのグループに入っているユーザーです。それ以外のユーザーが実行すると、自分のプロセスのログしか表示されません。この記事のコマンドは sudo を付けて書いています。
毎回 sudo を付けずに読みたい場合は、ユーザーを systemd-journal グループに入れます(ログインし直すと有効になります)。
sudo usermod -aG systemd-journal ユーザー名
基本の表示
# すべてのログを表示する(古いものから順に、ページャーで表示)
sudo journalctl
# 新しい順に表示する
sudo journalctl -r
# 最新の 100 行だけ表示する(-n だけなら 10 行)
sudo journalctl -n 100
# ページャーで開いて末尾(最新)に移動する
sudo journalctl -e
# 新しく書き込まれるログを流し続ける(tail -f と同じ使い方)
sudo journalctl -f
引数なしの journalctl は、古いログから表示します。最新のログを見たいときは -e、-n、-r のどれかを使います。
表示は less で開きます。q で終了、/文字列 で検索、G で末尾、g で先頭に移動します。ページャーを使わずに画面へそのまま出したいとき(grep に渡すときなど)は --no-pager を付けます。
sudo journalctl -u nginx --no-pager | grep -i error
サービス(ユニット)で絞り込む
# nginx のログだけを表示する
sudo journalctl -u nginx
# 複数のサービスをまとめて表示する
sudo journalctl -u nginx -u php8.3-fpm
# サービスの最新 50 行を表示し、その後のログも流し続ける
sudo journalctl -u nginx -n 50 -f
-u にはユニット名を指定します(.service は省略できます)。PHP-FPM のユニット名は環境によって違い、Debian / Ubuntu では php8.3-fpm のようにバージョンが入り、RHEL 系では php-fpm です。名前がわからないときは次のコマンドで確認します。
systemctl list-units --type=service | grep -i php
サービスが起動しないときは、systemctl status で状態と直近のログを見てから、journalctl で前後のログを詳しく確認すると原因を追いやすくなります。
sudo systemctl status nginx
sudo journalctl -u nginx -n 100 --no-pager
時間で絞り込む
# 日時の範囲を指定する
sudo journalctl --since "2026-10-30 10:00" --until "2026-10-30 12:00"
# 今日・昨日のログ
sudo journalctl --since today
sudo journalctl --since yesterday --until today
# 直近 1 時間のログ
sudo journalctl --since "1 hour ago"
sudo journalctl --since -1h
# サービスと組み合わせる
sudo journalctl -u nginx --since "30 min ago"
日時は "2026-10-30 18:17:16" の形で書き、時刻を省くとその日の 0 時、日付を省くと今日として扱われます。today・yesterday・now などのキーワードや、-1h・"1 hour ago" のような相対的な指定も使えます。書き方の詳細は systemd.time(7) にまとめられています。
起動(ブート)ごとに見る
# 今回の起動以降のログ
sudo journalctl -b
# 1 つ前の起動のログ(再起動の直前に何があったかを調べる)
sudo journalctl -b -1
# 1 つ前の起動の、最後の 50 行
sudo journalctl -b -1 -n 50
# 記録されている起動の一覧
sudo journalctl --list-boots
-b -1 などで過去の起動を見るには、ログが再起動後も残る設定(後述の永続化)になっている必要があります。
重要度(優先度)で絞り込む
# err 以上(err・crit・alert・emerg)だけを表示する
sudo journalctl -p err
# 今回の起動の warning 以上
sudo journalctl -b -p warning
# 範囲で指定する(warning から err まで)
sudo journalctl -p warning..err
優先度は次の8段階です。1つだけ指定すると、そのレベルと、それより重要なレベルが表示されます。
| 数値 | 名前 | 意味 |
|---|---|---|
| 0 | emerg |
システムが使えない |
| 1 | alert |
すぐに対処が必要 |
| 2 | crit |
重大な状態 |
| 3 | err |
エラー |
| 4 | warning |
警告 |
| 5 | notice |
通常だが重要な事象 |
| 6 | info |
情報 |
| 7 | debug |
デバッグ用 |
文字列やプログラムで絞り込む
# メッセージに "timeout" を含むログ(小文字だけの指定は大文字小文字を区別しない)
sudo journalctl -u nginx -g timeout
# 正規表現も使える
sudo journalctl -g "Failed password|Invalid user"
# syslog の識別子(プログラム名)で絞り込む
sudo journalctl -t sudo
# カーネルのメッセージ(dmesg に相当、今回の起動分)
sudo journalctl -k
# プロセス ID で絞り込む
sudo journalctl _PID=1234
-g(--grep)はメッセージ本文を PCRE の正規表現で検索します。パターンがすべて小文字なら大文字と小文字を区別しません。ディストリビューションのビルドによっては -g が使えないことがあり、その場合は --no-pager で出力して grep に渡します。
-t はサービス名ではなく、ログに記録されたプログラム名で絞り込みます。プログラム名はバージョンで変わることがあり、たとえば OpenSSH 9.8 以降ではログイン処理のログが sshd ではなく sshd-session の名前で記録されます。SSH のログはサービス名(Debian / Ubuntu は ssh、RHEL 系は sshd)を -u に指定して見るほうが確実です。
出力形式を変える
# 時刻を ISO 8601 形式で表示する
sudo journalctl -u nginx -o short-iso
# メッセージ本文だけを表示する
sudo journalctl -u nginx -o cat
# JSON(1 件 1 行)で出力する。スクリプトや jq での処理向け
sudo journalctl -u nginx -n 20 -o json
# 見やすく整形した JSON
sudo journalctl -u nginx -n 1 -o json-pretty
# すべてのフィールドを表示する
sudo journalctl -u nginx -n 1 -o verbose
-o には short(初期値)、short-iso、short-precise、cat、verbose、json、json-pretty、export などを指定できます。-x を付けると、メッセージによっては説明文(カタログ)が追加されます。
ログを再起動後も残す(永続化)
ジャーナルの保存先は /etc/systemd/journald.conf の Storage= で決まります。初期値の auto では、/var/log/journal ディレクトリーがあればディスクに保存し、なければメモリー上(/run/log/journal)に保存して再起動で消えます。どちらになっているかは次のコマンドで確認できます。
ls -d /var/log/journal /run/log/journal 2>/dev/null
sudo journalctl --disk-usage
再起動後もログを残すには、設定ファイルを追加して Storage=persistent を指定し、journald を再起動します。
sudo mkdir -p /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/persistent.conf > /dev/null <<'EOF'
[Journal]
Storage=persistent
EOF
sudo systemctl restart systemd-journald
Storage=persistent にすると、/var/log/journal がなければ作られます。再起動後に sudo journalctl --list-boots で過去の起動が一覧に出れば、永続化できています。
ログの容量を確認・整理する
# ジャーナルが使っている容量
sudo journalctl --disk-usage
# 7 日より古いログを削除する
sudo journalctl --rotate --vacuum-time=7d
# 合計 500MB 以下になるまで古いログを削除する
sudo journalctl --rotate --vacuum-size=500M
--vacuum-time・--vacuum-size・--vacuum-files が削除するのは、書き込みが終わった古いファイル(アーカイブ済みのファイル)だけです。--rotate を一緒に付けると、いま書き込み中のファイルも先にアーカイブされ、それまでのログすべてが整理の対象になります。
手動で消すのではなく上限を決めておきたい場合は、journald.conf で設定します。
# /etc/systemd/journald.conf.d/size.conf
[Journal]
SystemMaxUse=1G
MaxRetentionSec=1month
SystemMaxUse= はディスクに保存するジャーナルの合計の上限、MaxRetentionSec= は保存する期間の上限です。保存後に sudo systemctl restart systemd-journald で反映します。
よく使う組み合わせ
| 調べたいこと | コマンド |
|---|---|
| サービスが起動しない理由 | sudo journalctl -u nginx -b -n 100 --no-pager |
| 今まさに出ているエラー | sudo journalctl -p err -f |
| 再起動の直前の様子 | sudo journalctl -b -1 -e |
| 特定の時間帯の全ログ | sudo journalctl --since "2026-10-30 03:00" --until "2026-10-30 03:30" |
| SSH のログイン失敗(Debian / Ubuntu) | sudo journalctl -u ssh -g "failed password" --since today |
| ディスクを圧迫していないか | sudo journalctl --disk-usage |
まとめ
- 引数なしの
journalctlは古い順。最新を見るには-e・-n・-r、流し続けるには-f - サービスは
-u、時間は--since/--until、起動単位は-b、重要度は-p、文字列は-g - スクリプトで扱うときは
-o jsonや-o cat、パイプに渡すときは--no-pager - 過去の起動のログを残すには
Storage=persistent - 容量は
--disk-usageで確認し、--rotate --vacuum-time=やSystemMaxUse=で抑える
関連記事: