今回は、RHELやCentOS Stream、Rocky Linuxなどで採用されているsystemdのジャーナルログについて、分かりやすく解説します。
Linuxサーバーの運用やトラブルシューティングにおいて、ログの確認は最も基本的かつ重要なスキルです。systemdジャーナルを使いこなせるようになると、問題の原因特定や日常的なシステム監視が格段に効率化されます。
ジャーナルログとは?
ジャーナルログ(systemd journal)は、systemdが管理する統合ログシステムです。システムの起動からシャットダウンまで、あらゆるイベントやメッセージを一元的に記録します。このログはjournalctlコマンドを使って閲覧・検索することができます。
従来のLinuxシステムでは、ログファイルが/var/log/配下に個別のテキストファイルとして保存されていましたが、systemdジャーナルではバイナリ形式で効率的に管理されます。
従来のsyslogとの違い
systemdジャーナルと従来のsyslogには、いくつかの重要な違いがあります。
主な相違点
| 項目 | syslog | systemdジャーナル |
|---|---|---|
| ログ形式 | テキストファイル | バイナリ形式 |
| 保存場所 | /var/log/配下の個別ファイル | /var/log/journal/(永続化時) |
| 閲覧方法 | cat, tail, grep等 | journalctl専用コマンド |
| メタデータ | 限定的 | 豊富(プロセスID、ユニット名等) |
| 構造化 | 非構造化テキスト | 構造化されたエントリ |
| デフォルト保存 | 永続的 | 再起動で消える(設定変更で永続化可能) |
注意点: RHELでは、systemdジャーナルとrsyslogが共存していることが多く、両方のログを確認する必要がある場合もあります。systemdジャーナルは主にsystemdが管理するサービスのログを、rsyslogは従来型のアプリケーションログを担当します。
基本的な使い方
最新のログを表示
最もシンプルな使い方は、全ログを表示することです。
journalctl
このコマンドを実行すると、システム起動時からのすべてのログが時系列で表示されます。ログはlessコマンドで開かれるため、スペースキーで下にスクロール、qキーで終了できます。
リアルタイムでログを監視
システムの動作をリアルタイムで確認したい場合は、-fオプションを使います。
journalctl -f
これはtail -fと同じように、新しいログエントリが追加されるたびに自動的に表示されます。トラブルシューティング中に非常に便利です。
最新のログのみを表示
直近のログだけを確認したい場合は、-nオプションで行数を指定します。
# 最新の50行を表示
journalctl -n 50
# 最新の100行を表示
journalctl -n 100
優先度でフィルタリング
ログには優先度(priority)が設定されており、エラーや警告だけを表示することができます。
# エラーレベル以上のみ表示
journalctl -p err
# 警告レベル以上のみ表示
journalctl -p warning
優先度レベルは以下の通りです:
- 0: emerg(緊急)
- 1: alert(警報)
- 2: crit(致命的)
- 3: err(エラー)
- 4: warning(警告)
- 5: notice(通知)
- 6: info(情報)
- 7: debug(デバッグ)
よく使うオプション一覧
journalctlには多数のオプションがあります。以下は実務でよく使うオプションの一覧です。
| オプション | 説明 | 使用例 |
|---|---|---|
| -f | リアルタイムで監視(tail -f相当) | journalctl -f |
| -n [数値] | 最新の指定行数を表示 | journalctl -n 100 |
| -p [レベル] | 指定した優先度以上のログを表示 | journalctl -p err |
| -u [ユニット名] | 特定のサービスユニットのログを表示 | journalctl -u httpd.service |
| –since | 指定時刻以降のログを表示 | journalctl –since “2024-01-01 10:00:00” |
| –until | 指定時刻までのログを表示 | journalctl –until “2024-01-01 12:00:00” |
| -b | 現在の起動以降のログを表示 | journalctl -b |
| -b -1 | 前回の起動時のログを表示 | journalctl -b -1 |
| -k | カーネルメッセージのみ表示 | journalctl -k |
| -r | 逆順(新しい順)で表示 | journalctl -r |
| –no-pager | ページャーを使わず直接出力 | journalctl –no-pager |
| -o [形式] | 出力形式を指定 | journalctl -o json-pretty |
特定のサービスやユニットのログ確認方法
systemdでは、各サービスが「ユニット」として管理されています。特定のサービスのログだけを確認する方法を見ていきましょう。
サービスユニットのログを表示
# httpdサービスのログを表示
journalctl -u httpd.service
# sshdサービスのログを表示
journalctl -u sshd.service
# NetworkManagerのログを表示
journalctl -u NetworkManager.service
ポイント: .service拡張子は省略可能です。journalctl -u httpdでも同じ結果が得られます。
複数のユニットを同時に確認
# httpdとmysqldのログを同時に表示
journalctl -u httpd.service -u mysqld.service
サービスのログをリアルタイム監視
# httpdサービスのログをリアルタイムで監視
journalctl -u httpd.service -f
これは、Webサーバーの動作確認やアクセスログの監視に非常に便利です。
特定期間のサービスログを確認
# 今日のhttpdログのみ表示
journalctl -u httpd.service --since today
# 昨日のhttpdログを表示
journalctl -u httpd.service --since yesterday --until today
# 具体的な日時を指定
journalctl -u httpd.service --since "2024-12-15 09:00:00" --until "2024-12-15 18:00:00"
systemdとの連携
systemdジャーナルは、systemdと緊密に連携して動作します。この連携により、サービスの状態とログを関連付けて確認できます。
サービス状態とログの確認
まず、サービスの状態を確認します。
systemctl status httpd.service
このコマンドの出力には、最新のログエントリも表示されます。より詳細なログを確認したい場合は、先ほどのjournalctl -uコマンドを使います。
サービスの起動失敗時のトラブルシューティング
サービスが起動しない場合、journalctlが非常に役立ちます。
# サービスの起動を試みる
sudo systemctl start httpd.service
# 起動に失敗した場合、ログを確認
journalctl -u httpd.service -n 50
# またはエラーログのみ表示
journalctl -u httpd.service -p err
systemd全体のログを確認
システム全体の起動プロセスやsystemd自体のメッセージを確認することもできます。
# 現在の起動以降のsystemdメッセージ
journalctl -b -u systemd
# systemdの初期化ログを確認
journalctl -b 0 -u systemd
実務でのトラブルシューティングシナリオ
ここでは、実際の業務でよくあるトラブルシューティングのシナリオを紹介します。
シナリオ1: Webサーバーが応答しない
# 1. サービスの状態を確認
systemctl status httpd.service
# 2. 最新のエラーログを確認
journalctl -u httpd.service -p err -n 50
# 3. 今日のログをすべて確認
journalctl -u httpd.service --since today
# 4. リアルタイムでログを監視しながら再起動
journalctl -u httpd.service -f
# 別のターミナルで: sudo systemctl restart httpd.service
シナリオ2: システム起動時のエラーを調査
# 1. 現在の起動時のエラーを確認
journalctl -b -p err
# 2. 前回の起動時と比較
journalctl -b -1 -p err
# 3. 特定のサービスの起動失敗を確認
journalctl -b -u [サービス名].service
シナリオ3: ディスク容量の問題を調査
# 1. システム全体のエラーを確認
journalctl -p err --since "1 hour ago"
# 2. カーネルメッセージを確認(ディスクエラー等)
journalctl -k -p warning --since "1 hour ago"
# 3. 特定のキーワードで検索
journalctl --since "1 hour ago" | grep -i "disk\|space\|full"
シナリオ4: 認証失敗の調査
# 1. sshdのログから認証失敗を確認
journalctl -u sshd.service | grep -i "failed\|failure"
# 2. 今日の認証関連のログを確認
journalctl --since today | grep -i "authentication\|failed password"
# 3. 特定の時間帯の認証ログを確認
journalctl --since "2024-12-15 18:00:00" --until "2024-12-15 20:00:00" | grep -i "auth"
注意点とベストプラクティス
ログの永続化設定
デフォルトでは、systemdジャーナルは再起動すると消えてしまいます。ログを永続化するには、以下の設定が必要です。
# ログ保存ディレクトリを作成
sudo mkdir -p /var/log/journal
# 適切な権限を設定
sudo systemd-tmpfiles --create --prefix /var/log/journal
# systemd-journaldを再起動
sudo systemctl restart systemd-journald
または、設定ファイルを編集します。
sudo vi /etc/systemd/journald.conf
以下の行のコメントを外し、値を設定します。
Storage=persistent
設定後、systemd-journaldを再起動します。
sudo systemctl restart systemd-journald
ログのディスク容量管理
ジャーナルログは時間とともに肥大化します。容量を管理するための設定をお勧めします。
sudo vi /etc/systemd/journald.conf
以下の設定例を参考にしてください。
SystemMaxUse=500M # 最大使用容量
SystemKeepFree=1G # 空き容量の確保
SystemMaxFileSize=100M # 1ファイルの最大サイズ
MaxRetentionSec=1month # 保持期間
設定後、systemd-journaldを再起動します。
手動でログをクリーンアップ
古いログを手動で削除することもできます。
# 指定した容量まで削減
sudo journalctl --vacuum-size=500M
# 指定した期間より古いログを削除
sudo journalctl --vacuum-time=30d
# 指定したファイル数を超えるログを削除
sudo journalctl --vacuum-files=5
root権限の必要性
journalctlは一般ユーザーでも使用できますが、システムログやサービスログの一部は管理者権限が必要です。権限不足でログが見えない場合は、sudoを使用してください。
sudo journalctl -u httpd.service
ログの出力形式
journalctlは様々な出力形式をサポートしています。自動化や外部ツールとの連携に便利です。
# JSON形式で出力
journalctl -u httpd.service -o json
# 見やすいJSON形式
journalctl -u httpd.service -o json-pretty
# 短縮形式(syslog風)
journalctl -u httpd.service -o short
# 詳細形式
journalctl -u httpd.service -o verbose
まとめ
今回は、RHELにおけるsystemdジャーナルログの基本的な使い方から、実践的なトラブルシューティング手法までを解説しました。
重要なポイント:
- journalctlはsystemd環境でのログ確認の基本ツール:従来のsyslogとは異なる構造化されたログシステムです。
- サービス単位でのログ確認が可能:
-uオプションで特定のサービスログを簡単に抽出できます。 - 時間範囲指定が柔軟:
--sinceと--untilで必要な期間のログだけを確認できます。 - 優先度フィルタリングが便利:エラーや警告だけを抽出することで、問題の特定が効率化されます。
- 永続化設定を忘れずに:デフォルトでは再起動でログが消えるため、重要なシステムでは永続化設定が必須です。
- ディスク容量管理が重要:ログの肥大化を防ぐため、適切な容量制限を設定しましょう。
systemdジャーナルを使いこなすことで、Linuxシステムの管理とトラブルシューティングのスキルが大きく向上します。最初は基本的なコマンドから始めて、徐々に高度なフィルタリングやオプションの組み合わせを試してみてください。
実際の業務では、システムの挙動を理解し、何か問題が発生した際に迅速に原因を特定できることが重要です。journalctlはそのための強力なツールとなるでしょう。

コメント