【RHEL】systemdジャーナルログ(journalctl)の基本と実践的な使い方

RHEL

今回は、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ジャーナルログの基本的な使い方から、実践的なトラブルシューティング手法までを解説しました。

重要なポイント

  1. journalctlはsystemd環境でのログ確認の基本ツール:従来のsyslogとは異なる構造化されたログシステムです。
  2. サービス単位でのログ確認が可能-uオプションで特定のサービスログを簡単に抽出できます。
  3. 時間範囲指定が柔軟--since--untilで必要な期間のログだけを確認できます。
  4. 優先度フィルタリングが便利:エラーや警告だけを抽出することで、問題の特定が効率化されます。
  5. 永続化設定を忘れずに:デフォルトでは再起動でログが消えるため、重要なシステムでは永続化設定が必須です。
  6. ディスク容量管理が重要:ログの肥大化を防ぐため、適切な容量制限を設定しましょう。

systemdジャーナルを使いこなすことで、Linuxシステムの管理とトラブルシューティングのスキルが大きく向上します。最初は基本的なコマンドから始めて、徐々に高度なフィルタリングやオプションの組み合わせを試してみてください。

実際の業務では、システムの挙動を理解し、何か問題が発生した際に迅速に原因を特定できることが重要です。journalctlはそのための強力なツールとなるでしょう。

 

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

RHELITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました