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= で抑える

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲