「tail -f /var/log/messages でログを追っていたけど、systemd環境ではうまく表示されない」
RHEL7/CentOS7以降のLinuxでは、ログ管理の仕組みがsyslogからsystemd-journaldに大きく変わりました。従来の/var/log/messagesに加えて、journalctlコマンドによるログ確認が必須スキルです。
この記事では、journalctlコマンドの基本操作から、サービス別のログ抽出、日時指定、優先度フィルタ、ジャーナルの容量管理まで、実務で必要な使い方を網羅します。
なぜjournalctlなのか? ~ 従来のsyslogとの違い
従来のLinuxでは、rsyslogがシステムログを/var/log/messagesや/var/log/secureなどのテキストファイルに書き出していました。ログの確認はcat、grep、tail -fで事足りていたわけです。しかし、systemd環境ではsystemd-journaldというログ収集デーモンが並行して動いています。journaldはログをバイナリ形式で保存するため、テキストエディタやcatでは読めません。代わりにjournalctlコマンドを使います。
journalctlを使うメリットは明確です。
・構造化データ:サービス名、PID、優先度などがメタデータとして記録されるため、ピンポイントで絞り込める
・日時指定が簡単:--sinceと--untilオプションで「昨日の深夜2時から3時」のようなフィルタが一発でできる
・起動単位の管理:前回起動時のログ、前々回起動時のログなど、再起動をまたいだログ管理ができる
・テキストログとの共存:rsyslogが併用されている環境では、/var/log/messagesも引き続き出力される
※RHEL/CentOSではrsyslogとjournaldが両方動いているのが一般的です。journalctlを覚えたからといって、/var/log配下のログが不要になるわけではありません。両方使えるようにしておきましょう。
journalctlの基本的な使い方
1. 全ログを表示する
引数なしでjournalctlを実行すると、システムの全ログが古い順に表示されます。# 全ログを表示(ページャーで開く) journalctl # ページャーを使わず全出力する場合 journalctl --no-pager
2. 特定サービスのログを確認する(-u)
最も頻繁に使うオプションです。-u(--unit)でサービス名を指定すると、そのサービスのログだけを抽出できます。# httpdのログだけ表示 journalctl -u httpd # sshdのログだけ表示 journalctl -u sshd # NetworkManagerのログだけ表示 journalctl -u NetworkManager
3. リアルタイムでログを監視する(-f)
tail -f /var/log/messagesの代わりに使えるオプションです。新しいログが出力されるたびに画面にリアルタイム表示されます。# 全ログをリアルタイム監視 journalctl -f # 特定サービスだけリアルタイム監視 journalctl -f -u httpd # 複数サービスを同時に監視 journalctl -f -u httpd -u php-fpm
4. 末尾N行だけ表示する(-n)
# 最新20行を表示(デフォルトは10行) journalctl -n 20 # sshdの最新50行を表示 journalctl -u sshd -n 50
5. 日時を指定してログを絞り込む(--since / --until)
障害対応で「昨夜の何時ごろから異常が出ていたか」を調べるときに重宝するオプションです。# 今日のログだけ表示 journalctl --since today # 昨日のログだけ表示 journalctl --since yesterday --until today # 特定日時の範囲を指定 journalctl --since "2026-03-19 02:00:00" --until "2026-03-19 03:00:00" # 1時間前からのログ journalctl --since "1 hour ago" # 特定サービスの日時指定も可能 journalctl -u httpd --since "2026-03-19 00:00:00"
6. 優先度でフィルタする(-p)
ログにはemerg(緊急)からdebug(デバッグ)まで8段階の優先度があります。-pオプションで指定した優先度以上のログだけを抽出できます。# エラー以上(err + crit + alert + emerg)を表示 journalctl -p err # 警告以上を表示 journalctl -p warning # 特定サービスのエラーだけ表示 journalctl -u httpd -p err
・0 emerg:システムが使用不能
・1 alert:即座に対処が必要
・2 crit:致命的な状態
・3 err:エラー
・4 warning:警告
・5 notice:注意(正常だが重要)
・6 info:情報
・7 debug:デバッグ
障害調査ではまずjournalctl -p errで全体のエラーを俯瞰し、怪しいサービスを-uで絞り込む、という流れが効率的です。
7. 今回の起動以降のログを表示する(-b)
# 今回の起動以降のログ journalctl -b # 前回起動時のログ journalctl -b -1 # 前々回起動時のログ journalctl -b -2
※-b -1以前のログを見るには、ジャーナルが永続化されている必要があります。永続化の設定は後述の「応用・実務Tips」で解説します。
応用・実務Tips
1. ジャーナルの容量を確認する(--disk-usage)
ジャーナルはバイナリファイルとしてディスクに蓄積されます。放置すると容量を圧迫するため、定期的に確認しましょう。# ジャーナルが使用しているディスク容量を確認 journalctl --disk-usage # 出力例 # Archived and active journals take up 1.2G in the file system.
2. 古いログを削除する(--vacuum-size / --vacuum-time)
ジャーナルの容量が大きくなりすぎた場合は、以下のコマンドで古いログを削除できます。# 500MBまで縮小(古いものから削除) sudo journalctl --vacuum-size=500M # 30日より前のログを削除 sudo journalctl --vacuum-time=30d # 直近3回分の起動ログだけ残す sudo journalctl --vacuum-files=3
3. ジャーナルを永続化する(Storage=persistent)
デフォルト設定では、ジャーナルは/run/log/journal/にメモリ上で保存されるため、再起動するとログが消えます。永続化するには、/etc/systemd/journald.confを編集します。
# /etc/systemd/journald.conf を編集 sudo vi /etc/systemd/journald.conf # [Journal] セクションに以下を設定 Storage=persistent # 設定変更後、journaldを再起動 sudo systemctl restart systemd-journald
容量制限も合わせて設定しておくのがおすすめです。
# /etc/systemd/journald.conf の設定例 [Journal] Storage=persistent SystemMaxUse=1G SystemMaxFileSize=100M MaxRetentionSec=90d
・SystemMaxFileSize:個々のジャーナルファイルの最大サイズ
・MaxRetentionSec:保持する最大期間
4. 出力フォーマットを変更する(-o)
# 短縮表示(デフォルト) journalctl -o short # ISO 8601形式の日時で表示(スクリプトの解析に便利) journalctl -o short-iso # JSON形式で出力(外部ツールとの連携に) journalctl -u httpd -o json # 1行1エントリのJSON形式 journalctl -u httpd -o json-pretty # 詳細な全フィールドを表示 journalctl -o verbose
5. 特定PIDのログを確認する
特定のプロセスが出力したログだけを確認したいときは、_PIDフィールドを指定します。# PID 1234のログを表示 journalctl _PID=1234 # カーネルメッセージだけ表示(dmesgの代替) journalctl -k
「No journal files were found」が出た時の対処法
journalctlを実行して以下のメッセージが表示される場合があります。$ journalctl No journal files were found.
・権限不足:一般ユーザーでジャーナルを読む権限がない。sudoを付けてsudo journalctlで実行するか、ユーザーをsystemd-journalグループに追加する
# ユーザーをsystemd-journalグループに追加(再ログイン後に有効) sudo usermod -aG systemd-journal ユーザー名
# ディレクトリを作成してjournaldを再起動 sudo mkdir -p /var/log/journal sudo systemd-tmpfiles --create --prefix /var/log/journal sudo systemctl restart systemd-journald
ログが再起動で消える場合の対処
「再起動するとjournalctlのログが全部消えている」という場合は、ジャーナルが永続化されていません。現在の設定を確認するには、以下のコマンドを実行します。
# ジャーナルの保存先を確認 journalctl --header | grep "File path" # /run/log/journal/ → 揮発性(再起動で消える) # /var/log/journal/ → 永続化済み
ジャーナルの容量が肥大化した時の対処
ジャーナルが数GBに膨れ上がってディスク容量を圧迫している場合は、以下の手順で対処します。# 1. 現在の使用量を確認 journalctl --disk-usage # 2. 古いログを削除して500MBまで縮小 sudo journalctl --vacuum-size=500M # 3. 削除後の使用量を確認 journalctl --disk-usage # 4. 再発防止のため、journald.confに上限を設定 sudo vi /etc/systemd/journald.conf # SystemMaxUse=1G を追記 # 5. 設定を反映 sudo systemctl restart systemd-journald
本記事のまとめ
journalctlはsystemd環境のログ管理に欠かせないコマンドです。サービスのトラブル対応から日常のログ監視まで、以下のコマンドを押さえておけば現場で困ることはありません。| やりたいこと | コマンド |
|---|---|
| 全ログを表示する | journalctl |
| 特定サービスのログを表示する | journalctl -u サービス名 |
| リアルタイムでログを監視する | journalctl -f |
| 最新N行だけ表示する | journalctl -n 行数 |
| 日時を指定してログを絞り込む | journalctl --since "YYYY-MM-DD HH:MM:SS" |
| エラー以上のログだけ表示する | journalctl -p err |
| 今回の起動以降のログを表示する | journalctl -b |
| 特定PIDのログを表示する | journalctl _PID=プロセスID |
| ジャーナルの容量を確認する | journalctl --disk-usage |
| 古いログを削除する(容量指定) | sudo journalctl --vacuum-size=500M |
| 古いログを削除する(日数指定) | sudo journalctl --vacuum-time=30d |
| カーネルメッセージを表示する | journalctl -k |
サーバーのログ管理、自信を持ってできますか?
journalctlはログ確認の基本ですが、実務ではログの読み方だけでなく、サーバー全体の構築・運用スキルが求められます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
