journalctl 実践フィルタ - 大量ログから必要な行を抜く

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 デバッグ

リアルタイムで監視するには

-ftail -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

次に読む