journalctl
『journalctl』は systemd が管理するジャーナル(構造化ログ)を参照するコマンドです。『-u』でサービスを絞り込み、『-p』でエラーレベルを指定し、『--since』、『--until』で時刻範囲を絞るなど、大量のログから必要な情報をすばやく取り出せます。『-f』オプションを使うとリアルタイムにログをフォローできるため、障害調査やデプロイ直後の動作確認に役立ちます。
構文
# -----------------------------------------------
# journalctl の基本構文
# -----------------------------------------------
# journalctl [オプション] [マッチ条件 ...]
# → systemd ジャーナルのログを表示します
# → オプションを何も付けない場合はすべてのログを表示します(古い順)
# -----------------------------------------------
# サービス単位で絞り込む
# -----------------------------------------------
# journalctl -u {ユニット名}
# → 指定した systemd ユニット(サービス)のログのみ表示します
# 例: journalctl -u nginx.service
# journalctl -u {ユニット名} -f
# → サービスのログをリアルタイムにフォローします(tail -f 相当)
# 例: journalctl -u php-fpm.service -f
# -----------------------------------------------
# 表示件数を絞る
# -----------------------------------------------
# journalctl -n {行数}
# → 最新の N 行だけ表示します
# 例: journalctl -n 50
# journalctl -u {ユニット名} -n {行数}
# → サービスを絞った上で最新 N 行を表示します
# 例: journalctl -u nginx.service -n 100
# -----------------------------------------------
# 優先度(ログレベル)で絞り込む
# -----------------------------------------------
# journalctl -p {レベル}
# → 指定した優先度以上のログのみ表示します
# 優先度: emerg(0) alert(1) crit(2) err(3) warning(4) notice(5) info(6) debug(7)
# 例: journalctl -p err # err 以上(err/crit/alert/emerg)
# 例: journalctl -p warning # warning 以上
# -----------------------------------------------
# 時刻範囲で絞り込む
# -----------------------------------------------
# journalctl --since "{日時}" --until "{日時}"
# → 開始日時・終了日時を指定してログを絞り込みます
# 日時フォーマット: "YYYY-MM-DD HH:MM:SS" または "today" "yesterday" "-1h" 等
# 例: journalctl --since "2026-03-25 08:00:00" --until "2026-03-25 09:00:00"
# 例: journalctl --since "today"
# 例: journalctl --since "-30min"
# -----------------------------------------------
# 起動セッションで絞り込む
# -----------------------------------------------
# journalctl -b
# → 現在の起動セッション(最後に再起動してから)のログを表示します
# journalctl -b -1
# → ひとつ前の起動セッションのログを表示します
# -----------------------------------------------
# カーネルログ
# -----------------------------------------------
# journalctl -k
# → カーネルメッセージ(dmesg 相当)を表示します
# -----------------------------------------------
# ページャを無効にして全出力する
# -----------------------------------------------
# journalctl --no-pager
# → less などのページャを使わずにすべて標準出力に出力します
# → grep や他のコマンドにパイプで渡す場合に使用します
# 例: journalctl -u nginx.service --no-pager | grep "error"
# -----------------------------------------------
# 出力フォーマットを変える
# -----------------------------------------------
# journalctl -o {フォーマット}
# → 出力形式を指定します
# フォーマット: short(デフォルト)short-precise json cat verbose 等
# 例: journalctl -u nginx.service -o json
# 例: journalctl -u nginx.service -o short-precise # マイクロ秒まで表示
構文一覧
| オプション | 説明 |
|---|---|
-u {ユニット名} | 指定した systemd ユニット(サービス)のログのみ表示します。『.service』サフィックスは省略可能です。 |
-f | ログをリアルタイムにフォローします。『tail -f』相当の動作です。『Ctrl+C』で終了します。 |
-n {行数} | 最新の N 行だけ表示します。デフォルトは最新 10 行です。 |
-p {レベル} | 指定した優先度以上のログのみ表示します。『err』を指定するとエラー・クリティカル・アラート・緊急ログだけ抽出できます。 |
--since "{日時}" | 指定した日時以降のログを表示します。"today" "yesterday" "-1h" などの相対指定も使えます。 |
--until "{日時}" | 指定した日時以前のログを表示します。『--since』と組み合わせて時刻範囲を絞り込みます。 |
-b | 現在の起動セッションのログのみ表示します。『-b -1』でひとつ前の起動セッションを参照できます。 |
-k | カーネルメッセージのみ表示します。『dmesg』コマンドと同等の情報です。 |
--no-pager | ページャを使わずにすべてを標準出力に出力します。『grep』などへのパイプで活用します。 |
-o {フォーマット} | 出力形式を指定します。『json』でスクリプト処理向けの JSON 出力、『short-precise』でマイクロ秒単位のタイムスタンプになります。 |
--disk-usage | ジャーナルが使用しているディスク容量を表示します。 |
--vacuum-time={期間} | 指定した期間より古いジャーナルを削除します。例:--vacuum-time=7d(7日より古いログを削除)。 |
使用例
# ----------------------------------------------- # nginx.service のログを確認する # ----------------------------------------------- # nginx サービスの最新 20 行を表示します journalctl -u nginx.service -n 20 # nginx サービスのログをリアルタイムにフォローします # デプロイ直後やリクエスト確認時に使います journalctl -u nginx.service -f
実行するコマンドは次の通りです。
$ journalctl -u nginx.service -n 5 Mar 25 08:01:14 kakarot nginx[1423]: 2026/03/25 08:01:14 [notice] 1423#1423: signal process started Mar 25 08:01:14 kakarot systemd[1]: Reloading A high performance web server and a reverse proxy server... Mar 25 08:01:14 kakarot systemd[1]: Reloaded A high performance web server and a reverse proxy server. Mar 25 08:02:35 kakarot nginx[1502]: 192.168.1.10 - - [25/Mar/2026:08:02:35 +0900] "GET / HTTP/1.1" 200 612 Mar 25 08:03:10 kakarot nginx[1502]: 192.168.1.10 - - [25/Mar/2026:08:03:10 +0900] "GET /api/power-level HTTP/1.1" 200 128
エラーログのみ抽出する
# ----------------------------------------------- # err 以上の優先度でエラーを抽出します # ----------------------------------------------- # 現在の起動セッションのエラーログをすべて表示します journalctl -b -p err # nginx サービスのエラーだけ取り出します journalctl -u nginx.service -p err --no-pager # php-fpm サービスの warning 以上のログを確認します journalctl -u php-fpm.service -p warning --no-pager
実行するコマンドは次の通りです。
$ journalctl -u nginx.service -p err --no-pager Mar 25 07:45:02 kakarot nginx[1201]: 2026/03/25 07:45:02 [error] 1201#1201: *3 connect() failed (111: Connection refused) while connecting to upstream Mar 25 07:58:44 kakarot nginx[1201]: 2026/03/25 07:58:44 [error] 1201#1201: *7 open() "/var/www/html/favicon.ico" failed (2: No such file or directory)
時刻範囲を指定してログを絞り込む
# ----------------------------------------------- # --since / --until で時刻範囲を絞ります # ----------------------------------------------- # 今日の 07:00 〜 08:00 のログを表示します journalctl --since "2026-03-25 07:00:00" --until "2026-03-25 08:00:00" # 直近 30 分のログを表示します journalctl --since "-30min" # 直近 30 分の nginx エラーを絞り込みます journalctl -u nginx.service --since "-30min" -p err --no-pager
実行するコマンドは次の通りです。
$ journalctl --since "2026-03-25 07:00:00" --until "2026-03-25 08:00:00" -u nginx.service --no-pager Mar 25 07:00:05 kakarot systemd[1]: Started A high performance web server and a reverse proxy server. Mar 25 07:00:05 kakarot nginx[987]: 2026/03/25 07:00:05 [notice] 987#987: using the "epoll" event method Mar 25 07:00:05 kakarot nginx[987]: 2026/03/25 07:00:05 [notice] 987#987: nginx/1.24.0 Mar 25 07:45:02 kakarot nginx[1201]: 2026/03/25 07:45:02 [error] 1201#1201: *3 connect() failed (111: Connection refused) while connecting to upstream
JSON 出力でログをスクリプト処理する
# ----------------------------------------------- # -o json でログを JSON 形式で出力します # ----------------------------------------------- # nginx サービスの最新 3 件を JSON で出力します # jq コマンドと組み合わせてフィールドを抽出できます journalctl -u nginx.service -n 3 -o json --no-pager | jq '._HOSTNAME, .MESSAGE'
実行するコマンドは次の通りです。
$ journalctl -u nginx.service -n 3 -o json --no-pager | jq '._HOSTNAME, .MESSAGE' "kakarot" "2026/03/25 08:02:35 [notice] 1502#1502: signal process started" "kakarot" "192.168.1.10 - - [25/Mar/2026:08:02:35 +0900] \"GET / HTTP/1.1\" 200 612" "kakarot" "192.168.1.10 - - [25/Mar/2026:08:03:10 +0900] \"GET /api/power-level HTTP/1.1\" 200 128"
ジャーナルのディスク使用量を確認して古いログを削除する
# ----------------------------------------------- # ジャーナルの容量管理 # ----------------------------------------------- # ジャーナルが使用しているディスク容量を確認します journalctl --disk-usage # 7 日より古いジャーナルを削除します sudo journalctl --vacuum-time=7d # ジャーナルサイズを 500MB 以下に抑えます sudo journalctl --vacuum-size=500M
実行するコマンドは次の通りです。
$ journalctl --disk-usage Archived and active journals take up 124.0M in the file system. $ sudo journalctl --vacuum-time=7d Vacuuming done, freed 56.0M of archived journals from /var/log/journal/.
概要
『journalctl』は systemctl と同じく systemd の中核コマンドの一つです。systemd は各サービス(systemd ユニット)のログをバイナリ形式のジャーナルに蓄積しており、『journalctl』がその読み出しインターフェースになります。『-u』によるサービス絞り込みと『-p err』によるエラー抽出を組み合わせると、障害発生時に素早く原因を特定できます。『-f』によるリアルタイムフォローはデプロイ直後のアプリケーション動作確認にも有効です。ログが増えてディスクを圧迫する場合は『--vacuum-time』、『--vacuum-size』で定期的に整理することをお勧めします。『/etc/systemd/journald.conf』を編集すると保存期間やサイズ上限を恒久的に設定できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。