journalctl 実践フィルタ - 大量ログから必要な行を抜く
この記事で解決できること
journalctl は systemd のログ管理ツールで、正しいフィルタを組み合わせれば、数百万行のログから目的の行を数秒で抽出できる。以下が実務で最頻出のコマンドパターンだ。
よく使う組み合わせ(コピペ用)
# 直近1時間のnginxエラー journalctl -u nginx -p err --since "1 hour ago" # 今日のブートから全エラー journalctl -b -p err # リアルタイムでユニット監視 journalctl -u myapp.service -f
ユニットを絞るには
特定のサービスだけを見るには -u オプション。最も使用頻度が高い。
# 単一ユニット journalctl -u nginx.service # 複数ユニットを同時指定 journalctl -u nginx.service -u php-fpm.service
ユニット名は .service を省略できる(-u nginx も動く)。
時間範囲を指定するには
--since / --until で期間を絞る。相対表記と絶対表記の両方が使える。
# 直近1時間 journalctl --since "1 hour ago" # 直近30分 journalctl --since "30 min ago" # 特定日時から現在まで journalctl --since "2026-05-30 14:00:00" # 範囲指定 journalctl --since "2026-05-30 10:00" --until "2026-05-30 12:00"
-S は --since、-U は --until の短縮形。スクリプト内では長い形式のほうが可読性が高い。
エラーだけを抜くには
-p で syslog 優先度レベルを絞る。指定したレベル以上の深刻度が表示される。
# errレベル以上(err, crit, alert, emerg) journalctl -p err # warningレベル以上 journalctl -p warning # 特定レベルのみ(範囲指定) journalctl -p err..err
| 数値 | キーワード | 意味 |
|---|---|---|
| 0 | emerg | システム使用不可 |
| 1 | alert | 即座の対処必要 |
| 2 | crit | 重大なエラー |
| 3 | err | エラー |
| 4 | warning | 警告 |
| 5 | notice | 通常だが重要 |
| 6 | info | 情報メッセージ |
| 7 | debug | デバッグ |
リアルタイムで監視するには
-f は tail -f 相当。新しいログが出力されるたびに追加表示される。
# デプロイ後のリアルタイム監視 journalctl -u myapp.service -f # エラーのみリアルタイム監視 journalctl -u myapp.service -p err -f
Ctrl+C で終了。-n で最新 N 行から開始できる。
# 最新50行から始めてフォロー journalctl -u nginx -n 50 -f
ブート単位で確認するには
-b は「現在のブートのログ」に絞る。再起動を跨いだ比較は --list-boots で番号を確認してから指定する。
# 現在のブートのログ journalctl -b # 過去のブート一覧を確認 journalctl --list-boots # 1回前のブート journalctl -b -1 # 2回前のブート journalctl -b -2
-3 d7a3f8... Mon 2026-05-27 09:00 JST—Mon 2026-05-27 18:30 JST -2 a1b2c3... Tue 2026-05-28 08:45 JST—Tue 2026-05-28 20:00 JST -1 e5f6a7... Wed 2026-05-29 09:10 JST—Wed 2026-05-29 23:45 JST 0 b8c9d0... Thu 2026-05-30 08:00 JST—present
フィールド・プロセスで絞るには
journalctl はフィールドキーを直接指定してフィルタできる。man systemd.journal-fields に全フィールドが記載されている。
# PIDを指定 journalctl _PID=12345 # コマンド名で絞る journalctl _COMM=sshd # syslogの識別子で絞る journalctl SYSLOG_IDENTIFIER=nginx # UID 1000 のプロセスのログ journalctl _UID=1000
journalctl -F _COMM で _COMM フィールドに存在する値の一覧を確認できる。どんな識別子があるか不明なときに便利。
grep と組み合わせるには
--grep オプション(v233 以降)か、パイプで grep する。
# 組み込みの --grep journalctl -u nginx --grep "error" # 正規表現使用 journalctl -u nginx --grep "5[0-9][0-9]" # パイプで grep journalctl -u nginx | grep -i "connection refused" # 時間とgrepの組み合わせ journalctl --since "2 hours ago" | grep "ERROR"
--grep はメッセージフィールドのみを検索する。フィールド全体を検索したい場合はパイプ経由の grep が確実。
出力形式を変えるには
-o で出力形式を制御する。ログ解析や他ツールとの連携に使う。
# JSON形式(1ログ = 1行) journalctl -u nginx -o json # 整形済みJSON journalctl -u nginx -o json-pretty # タイムスタンプを短縮表示 journalctl -o short # メッセージのみ(メタデータなし) journalctl -o cat
JSON 形式は jq でパースするときに有用。
# エラーのタイムスタンプとメッセージだけ抽出 journalctl -u nginx -p err -o json | jq -r '.__REALTIME_TIMESTAMP + " " + .MESSAGE'
--no-pager をつけないとページャーが起動する。スクリプト内では必須。
journalctl -u nginx --no-pager | wc -l
まとめ:よく使うフィルタ早見表
フィルタは自由に組み合わせられる。まず -u でユニットを絞り、-p err でエラーだけに絞り込むのが実務での基本パターン。
| 目的 | コマンド |
|---|---|
| ユニット指定 | journalctl -u nginx |
| 時間指定 | journalctl --since "1 hour ago" |
| エラーのみ | journalctl -p err |
| 現在ブート | journalctl -b |
| フォロー | journalctl -f |
| PID指定 | journalctl _PID=1234 |
| grepと組み合わせ | journalctl -u nginx --grep "error" |
| JSON出力 | journalctl -o json |
| ページャー無効 | journalctl --no-pager |
# 実務でよく使う組み合わせ例 journalctl -u nginx.service -p err --since "today" --no-pager journalctl -b -p warning -u ssh.service -f