journalctl の解明:Linuxシステムログ活用ガイド

systemdの `journalctl` ユーティリティを習得し、Linuxシステムログの効果的な表示、フィルタリング、分析を行いましょう。このガイドでは、リアルタイム監視、時間ベースのクエリ、サービスユニットログの分離、そして強力なトラブルシューティングのためのジャーナルディスク使用量の管理に必要な重要コマンドを網羅しています。

34 ビュー

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

journalctlユーティリティは、systemdのジャーナリングシステムによって管理される構造化ログの表示と分析のための中心的なコマンドです。多くのLinuxディストリビューションにおける現代のロギング標準として、効果的なシステム管理、サービス管理、そして特にトラブルシューティングのためには、journalctlの理解が不可欠です。

従来のテキストベースのログファイル(/var/logにあるものなど)とは異なり、systemdはログをバイナリのインデックス化された形式でキャプチャします。これにより、時間、サービス、ブートIDなどに基づいた強力なクエリが可能になります。このガイドでは、システムの過去およびリアルタイムのイベントの全ポテンシャルを解き放つために必要な、必須コマンドを順を追って説明します。


Systemdジャーナルの理解

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

主要な概念:

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

必須の表示コマンド

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

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. 優先度レベルによるフィルタリング

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

優先度レベル 数値
err (エラー) 3
warning 4
notice 5
info 6
# SSHサービスからのすべてエラー、重大、および緊急メッセージを表示
journalctl -u sshd.service -p err

2. 特定のテキストの検索

標準的なフィルタリングだけでは不十分な場合、出力をgrepにパイプすることもできますが、journalctlにはテキスト検索のための組み込みメカニズムがあり、構造化データに対してはしばしばより効率的です。

# '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は、ロギングを単なるテキストファイルから進化させた、強力で柔軟なツールです。時間ベースのフィルタリング(--since--until)、ユニット分離(-u)、リアルタイム監視(-f)を習得することで、システム健全性の監視に対してきめ細かな制御を得ることができます。サービスの状態を確認する場合でも、先週のカーネルパニックを掘り下げる場合でも、journalctlは最新のLinuxシステムジャーナルへの主要なインターフェースとなります。