journalctlを解き明かす:Linuxシステムログのガイド

Linux systemdジャーナルログの表示、フィルタリング、フォロー、クリーンアップのためのjournalctlコマンドを学びます。

journalctlを解き明かす:Linuxシステムログのガイド

journalctlユーティリティは、systemd-journaldによって収集されたログを表示するための主要なコマンドです。サービスが失敗したとき、ブートがハングしたとき、またはカーネルメッセージが速すぎてスクロールして見逃したとき、通常はjournalctlで詳細を見つけることができます。

/var/logにあるプレーンテキストのログファイルとは異なり、ジャーナルはユニット名、優先度、ブートID、タイムスタンプなどのメタデータを含む構造化されたエントリを保存します。これにより、複数のファイルを開いて推測する代わりに、正確にログをフィルタリングできます。


Systemdジャーナルを理解する

コマンドに入る前に、journalctlが何を管理しているかを知ることが役立ちます。systemdジャーナルは、カーネル、サービス(ユニット)、アプリケーション、さらにはシステム起動プロセスからのログを収集します。これらのログは通常、構造化されたバイナリファイルに保存され、従来のフラットファイルよりもはるかに高速に検索およびフィルタリングできます。

主要な概念:

  • 永続性: ログは、再起動後も永続的に保存するように設定(永続モード)するか、メモリ内にのみ保持(揮発性モード)するように設定できます。
  • 構造化データ: ログにはメタデータ(ユニット名、優先度、ブートIDなど)が含まれており、journalctlはフィルタリングにこれを活用します。

基本的な表示コマンド

最も一般的なニーズは、単にログを表示することです。システムの履歴を探索し始めるための基本的なコマンドを以下に示します。

1. すべてのログを表示する

システムがログの記録を開始してからジャーナルによって収集されたすべてのエントリを表示するには、引数なしでコマンドを使用します:

journalctl

デフォルトでは、この出力はlessのようなツールを使用してページングされ、矢印キーやスペースバーを使用して上下に移動できます。

2. ログをリアルタイムで表示する(フォロー)

tail -fと同様に、ジャーナルに書き込まれているログを監視できます。これは、特定のサービスを起動またはデバッグするときに非常に便利です:

journalctl -f

リアルタイムビューを終了するには、Ctrl+Cを押します。

3. 出力を行数で制限する

最新のエントリのみが必要な場合は、-nフラグを使用して行数を指定します:

# 最後の20件のログエントリを表示
journalctl -n 20

4. 特定の時間以降のログを表示する

時間によるフィルタリングは、journalctlの最も強力な機能の1つです。相対タイムスタンプまたは絶対タイムスタンプを使用できます。

相対時間の例:

コマンド 説明
journalctl --since "1 hour ago" 過去1時間のログ。
journalctl --since "yesterday" 前の暦日の開始からのログ。
journalctl --since "2023-10-26 14:30:00" 特定の日時以降のログ。

ヒント: --since--untilを組み合わせて正確な範囲を指定できます。例:journalctl --since "2023-10-26" --until "2023-10-27 00:00:00"


ユニット、サービス、またはプロセスでログをフィルタリングする

journalctlの最も重要な用途の1つは、特定のsystemdユニット(サービス)に関連するメッセージを分離することです。

サービス名でフィルタリングする

-u(または--unit)フラグの後にサービス名(例:sshd.servicenginx.service)を指定します:

# Apache Webサーバーサービスのログのみを表示
journalctl -u apache2.service

# Dockerサービスのログをフォロー
journalctl -u docker.service -f

ブートIDでフィルタリングする

Systemdは、異なるシステムブート間でログを追跡します。以前の起動からのログを表示するには、まず利用可能なブートを一覧表示します:

journalctl --list-boots

これにより、インデックス付きのリスト(例:現在のブートの場合は-1-20)が出力されます。その後、インデックスまたは完全なブートIDを使用できます:

# 直前のブートからのログを表示
journalctl -b -1

# 特定のブートIDからのログを表示(上記のリストにある長いIDを使用)
journalctl -b a1b2c3d4e5f6...

カーネルメッセージでフィルタリングする

カーネルからのメッセージのみを表示するには(dmesgを使用するのと同様):

journalctl -k
# または、同等:
journalctl -b -k

高度なフィルタリングと出力制御

効果的なトラブルシューティングには、多くの場合、フィルターを組み合わせて出力形式を制御する必要があります。

1. 優先度レベルでフィルタリングする

ログには、0emerg)から7debug)までの優先度レベルが割り当てられます。-pまたは--priorityフラグを使用して、選択した重大度以上のメッセージを表示できます:

優先度レベル 数値
err または error 3
warning 4
notice 5
info 6
# SSHサービスからのすべてのエラー、クリティカル、および緊急メッセージを表示
journalctl -u sshd.service -p err

2. 特定のテキストを検索する

標準のフィルタリングでは不十分な場合、出力をgrepにパイプするか、journalctlのバージョンがサポートしている場合は--grepを使用します:

# すべてのログから「failed」という単語を含む行を検索
journalctl | grep failed

# または、より簡単なフィルタリングのために--grepオプションを使用(利用可能/推奨の場合)
journalctl --grep=failed

3. 出力形式を変更する

スクリプト作成や他のツールへのログ移動には、出力形式の変更が不可欠です。デフォルトはpretty(人間が読みやすい)です。

  • --output=json:エントリを構造化されたJSONオブジェクトとして出力します。
  • --output=short:prettyと似ていますが、色が少ないです。
  • --output=export:アーカイブ用に生のジャーナルエントリを出力します。
# 最近のログをJSONとして出力
journalctl -n 5 --output=json

4. フィルターを組み合わせる

フィルターは乗算的に積み重なります。過去10分間に記録されたNginxからのすべてのエラーを表示するには:

journalctl -u nginx.service --since "10 minutes ago" -p err

ジャーナルのサイズと永続性の管理

時間が経つにつれて、特に永続的なログ記録用に設定されている場合、ジャーナルはかなりのディスク容量を消費する可能性があります。システム管理者はそのサイズを管理する必要があります。

現在の使用状況を確認する

現在のジャーナルファイルが占有しているディスク容量を確認するには:

journalctl --disk-usage

古いログをクリーンアップする

時間または合計サイズに基づいてログをクリアできます。

時間によるクリーンアップ:

# 過去7日間のログのみを保持
journalctl --vacuum-time=7d

サイズによるクリーンアップ:

# 合計ログサイズを最大500メガバイトに削減
journalctl --vacuum-size=500M

警告: 特に古いブート(-b)からのログを削除する場合は注意してください。重要な診断情報が時期尚早に削除されないようにしてください。

まとめ

日常的なトラブルシューティングでは、journalctl -u <service> -n 50 --no-pagerから始め、ライブ出力が必要な場合は-fを追加し、問題が時間枠やブートに関連している場合は--sinceまたは-bを使用します。ログを削除する前に、journalctl --disk-usageを確認し、ロールバックやインシデントレビューのために十分な履歴を保持してください。