journalctl を使用して Linux システム ログを読み取る方法

  • Linux システム ロギングは、システム、ブート、およびカーネルのログ ファイルをバイナリ形式で一元化して管理する systemd の導入により変更されました。
  • journalctl コマンドは、システム ログ メッセージを読み取ってフィルタリングするために使用され、ユーザーがログをナビゲートして検索できるようにします。
  • ユーザーは、short、json、verbose、cat などのさまざまな出力形式を使用して、journalctl 出力の表示形式をカスタマイズし、特定のログの詳細に注目することができます。

Linux システム ロギングは、systemd の導入により変更されました。journalctlコマンドを使用してシステム ログ メッセージを読み取ってフィルタリングする方法を学びましょう。

一元化されたロギング

議論の的になりがちなsystemdシステムおよびサービス マネージャーは、システム ログが収集される方法に大きな変更をもたらしました。ログは、それを作成したサービスまたはデーモンに応じて、ファイル システムのさまざまな場所に配置されていました。しかし、それらには共通点がありました。すべてがプレーン テキスト ファイルだったのです。

systemd では、すべてのシステム、ブート、およびカーネルのログ ファイルが、中央の専用のロギング ソリューションによって収集および管理されます。それらが格納される形式はバイナリです。これにより、後述するように、JSON などのさまざまな形式でデータを抽出できるようになります。また、以前は別のログ ファイルに記録されていた関連情報を相互参照しやすくなります。データは現在単一のジャーナルに保持されているため、関心のある複数のソースからのデータを選択して、エントリの単一の相互に関連付けられたリストに表示できます。

journalctlは、ジャーナルを操作するために使用されるツールです。

飾り気のない journalctl

コマンドライン パラメーターなしでjournalctlを呼び出すことができます:

journalctl

journalctlは、リストの一番上に最も古いエントリが表示されるように、ジャーナル全体を表示します。リストはlessで表示され、lessの通常のナビゲーション機能を使用してページングや検索を行うことができます。また、左矢印キーと右矢印キーを使用して横にスクロールして、幅の広いログ エントリを読み取ることができます。

Endキーを押すと、リストの一番下、つまり最新のログ エントリに直接ジャンプします。

終了するには、Ctrl+Cを押します。

journalctlsudoを使用せずに呼び出すことができますが、sudoを使用するとログ内のすべての詳細が表示されます。

sudo journalctl

必要に応じて、journalctl--no-pagerオプションを使用して出力をターミナル ウィンドウに送信し、lessに送信しないようにすることができます。

sudo journalctl --no-pager

出力がターミナル ウィンドウを素早くスクロールし、コマンド プロンプトに戻ります。

journalctlが返す行数を制限するには、-n(行) オプションを使用します。10 行の出力を要求してみましょう:

sudo journalctl -n 10

ジャーナルの更新をフォローする

journalctlがジャーナルに到着した最新のエントリを表示するには、-f(フォロー) オプションを使用します。

sudo journalctl -f

最新のエントリのタイムスタンプは 07:09:07 です。新しいアクティビティが発生すると、新しいエントリが画面の下部に追加されます。ほぼリアルタイムの更新。クールです!

07:09:59 に、geek-appというアプリケーションが「HTG からの新しいメッセージ」というログ エントリをジャーナルに挿入しました。

表示形式を変更する

ジャーナルはバイナリ ファイルであるため、表示する前にその中のデータはテキストに変換または解析する必要があります。さまざまなパーサーを使用すると、同じバイナリ ソース データからさまざまな出力形式を作成できます。journalctlで使用できる形式はいくつかあります。

デフォルトの出力はショート形式です。これは、従来のシステム ログ形式と非常によく似ています。明示的にショート形式を要求するには、-o(出力) オプションをshort修飾子と共に使用します。

sudo journalctl -n 10 -o short-full

左から右に、フィールドは次のとおりです:

  • メッセージが作成された時刻 (現地時間)。
  • ホスト名。
  • プロセス名。これはメッセージを生成したプロセスです。
  • ログ メッセージ。

完全な日付と時刻のスタンプを取得するには、short-full修飾子を使用します:

sudo journalctl -n 10 -o short-full

この出力の日付と時刻の形式は、間もなく説明するように、期間でログ メッセージを選択するときに日付と時刻を指定する必要がある形式です。

各ログ メッセージに付随するすべてのメタデータを表示するには、verbose修飾子を使用します。

sudo journalctl -n 10 -o verbose

考えられるフィールドはたくさんありますが、すべてのフィールドがメッセージに存在することはまれです。

説明する価値のあるフィールドの 1 つはPriorityフィールドです。この例では、値は 6 です。値はメッセージの重要性を表します。

  • 0: 緊急。システムを使用できません。
  • 1: アラート。すぐに修正する必要がある状態がフラグ付けされています。
  • 2: クリティカル。これには、クラッシュ、コアダンプ、およびプライマリ アプリケーションの重大な障害が含まれます。
  • 3: エラー。エラーが報告されましたが、重大なエラーとはみなされません。
  • 4: 警告。無視するとエラーになる可能性がある状態に注意を喚起します。
  • 5: 通知。エラーではないが異常なイベントを報告するために使用されます。
  • 6: 情報。通常の操作メッセージ。これらはアクションを必要としません。
  • 7: デバッグ。アプリケーションをデバッグしやすくするためにアプリケーションに挿入されたメッセージ。

出力を適切に形成された JavaScript Object Notation (JSON) オブジェクトとして提示したい場合は、json修飾子を使用します:

sudo journalctl -n 10 -o json

各メッセージは適切に形成された JSON オブジェクトとして適切にラップされ、出力の 1 行につき 1 つのメッセージが表示されます。

JSON 出力をきれいに印刷するには、json-pretty修飾子を使用します。

sudo journalctl -n 10 -o json-pretty

各 JSON オブジェクトは複数の行に分割され、各名前と値のペアが新しい行に配置されます。

タイムスタンプやその他のメタデータなしでログ エントリ メッセージのみを表示するには、cat修飾子を使用します:

sudo journalctl -n 10 -o cat

この表示形式では、どのプロセスがログ イベントを発生させたかを特定するのが困難になる可能性がありますが、一部のメッセージには手がかりが含まれています。

期間でログ メッセージを選択する

journalctlからの出力を関心のある期間に制限するには、-S(since) オプションと-U(until) オプションを使用します。

特定の日時以降のログ エントリを表示するには、このコマンドを使用します:

sudo journalctl -S "2020-91-12 07:00:00"

この表示には、コマンドの日付と時刻以降に到着したメッセージのみが含まれます。

レポートする期間を定義するには、-S(since) オプションと-U(until) オプションの両方を一緒に使用します。このコマンドは、15 分間のログ メッセージを調べます:

sudo journalctl -S "2020-91-12 07:00:00" -U "2020-91-12 07:15:00"

システムで奇妙なことが起こり、それがいつ起こったかがわかっている場合は、この組み合わせを使用するのが最適です。

相対期間を使用する

期間を選択するときは、相対アドレス指定を使用できます。つまり、「1 日前のすべてのイベントから現在まで」などの内容を指定できます。このコマンドの意味はまさにそれです。「d」は「day」を表し、「-1」は 1 日前を意味します。

sudo journalctl -S -1d

ログ メッセージは、昨日の 00:00:00 から「現在」までリストされます。

最近の出来事について調査したい場合は、時間単位で測定された相対期間を指定できます。ここでは、過去 1 時間のログ メッセージを確認しています:

sudo journalctl -S -1h

過去 1 時間のメッセージが表示されます。「m」を使用して、分で測定された相対期間を設定したり、「w」を使用して週を設定したりすることもできます。

journalctltodayyesterdaytomorrowを理解します。これらの修飾子は、一般的な期間を指定する便利な方法を提供します。昨日のすべてのイベントを表示するには、このコマンドを使用します:

sudo journalctl -S yesterday

昨日の真夜中 00:00:00 までのすべてのジャーナル ログ イベントが取得され、表示されます。

今日受信したすべてのログ メッセージをこれまで表示するには、このコマンドを使用します:

sudo journalctl -S today

コマンドが発行される時刻まで、00:00:00 からすべてが表示されます。

さまざまな期間の修飾子を組み合わせることができます。2 日前からの今日までのすべてを表示するには、このコマンドを使用します:

sudo journalctl -S -2d -U today

一昨日から今日までのすべてが取得され、表示されます。

データ フィールドでログ メッセージを選択する

幅広いジャーナル フィールドに一致するログ メッセージを検索できます。これらの検索では、各メッセージに添付されたメタデータで一致を検索します。フィールドのリストを参照し、最も役立つものを選択することをお勧めします。

アプリケーションがすべてのフィールドを完了するかどうかの判断は、完全にアプリケーションの作者次第であることに注意してください。すべてのフィールドが入力されていることを保証することはできません。

すべてのジャーナル フィールド修飾子は同じ方法で使用されます。以下の例では、いくつか使用します。特定のアプリケーションからのログ メッセージを検索するには、_COMM(コマンド) 修飾子を使用します。-f(フォロー) オプションも使用する場合、journalctlは、このアプリケーションからの新しいメッセージが到着すると追跡します。

sudo journalctl -f _COMM=geek-app

ログ メッセージを生成したプロセスのプロセス ID を使用して、ログ エントリを検索できます。psコマンドを使用して、検索するデーモンまたはアプリケーションのプロセス ID を検索します。

sudo journalctl _PID=751

この記事を調査するために使用されたマシンでは、SSH デーモンはプロセス 751 です。

ユーザー ID で検索することもできます。これは、アプリケーションまたはコマンドを起動した人、またはプロセスを所有している人のユーザー ID です。

sudo journalctl _UID=1000

他のユーザー ID に関連付けられたすべてのメッセージは除外されます。ユーザー 1000 に関連するメッセージのみが表示されます:

特定のアプリケーションに関連するログ メッセージを検索するもう 1 つの方法は、実行可能ファイルへのパスを指定することです。

sudo journalctl /usr/bin/anacron

すべてのanacronスケジューラ ログ メッセージが取得され、表示されます。

検索を容易にするため、journalctlに、ジャーナル フィールドのいずれかの値をすべて一覧表示するように要求できます。

journalctlがログ メッセージを記録したユーザー ID を確認するには、-F(フィールド) オプションを使用し、_UIDフィールド識別子を渡します。

journalctl -F _UID

もう一度同じことをして、グループ ID (GID) を確認しましょう:

journalctl -F _GID

ジャーナル フィールド識別子のいずれでもこれを実行できます。

カーネル メッセージを一覧表示する

カーネル メッセージをすばやく分離するための組み込みの方法があります。自分で検索して分離する必要はありません。-k(カーネル) オプションは、他のすべてのメッセージを削除し、カーネル ログ エントリのインスタント ビューを提供します。

sudo journalctl -k

ハイライトは、Priorityフィールドの値に従ってメッセージの重要性を反映しています。

ブート メッセージを確認する

調査したいブートに関連した問題がある場合は、journalctlで対応できます。新しいハードウェアを追加したのに応答がない場合や、前回のシステム アップグレード後に以前は動作していたハードウェア コンポーネントが動作しなくなった場合があります。

前回のブートに関連するログ エントリを表示するには、-b(ブート) オプションを使用します:

journalctl -b

最後のブートのログ エントリが表示されます。

「最後のブート」とは、現在のログイン セッションでコンピュータを起動したブート プロセスを意味します。以前のブートを表示するには、数字を使用して、journalctlにどのブートに興味があるかを伝えることができます。3 番目に前のブートを表示するには、このコマンドを使用します:

journalctl -b 3

通常、問題が発生してマシンを再起動する必要があった場合は、興味があるのは前のブート シーケンスです。したがって、これは一般的なコマンド形式です。

ブートのシーケンスを混同しやすいです。これを回避するには、--list-bootsオプションを使用して、journalctlにジャーナルに記録されているブートを一覧表示するように要求できます。

journalctl --list-boots

日付とタイムスタンプからメッセージを表示するブートを特定し、左側の列の番号を使用して、そのブート シーケンスのログ メッセージを取得できます。32 ビットのブート識別子を選択して、それをjournalctlに渡すこともできます。

sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

要求したブート シーケンスのログ メッセージが取得され、表示されます。

ジャーナルのハード ドライブ領域を管理する

もちろん、ジャーナルとそのすべてのログ メッセージはハード ドライブに保存されます。つまり、ハード ドライブの領域を占有することになります。ジャーナルによって占有されている領域を確認するには、--disk-usageオプションを使用します。

journalctl --disk-usage

今日のハード ドライブでは、152 MB はほとんど領域を占有しませんが、デモンストレーションを目的として、それでもトリミングします。これを行う方法は 2 つあります。1 つ目は、ジャーナルを縮小したいサイズ制限を設定することです。もちろん、再び大きくなりますが、その新しい増加に備えて、今すぐトリミングできます。

素晴らしいタイトルの--vacuum-sizeオプションを使用し、ジャーナルを縮小したいサイズを渡します。100 MB を要求します。これを考える方法は、journalctlに「できる限り破棄してください。ただし、100 MB を下回らないでください」と要求しているということです。

journalctl --vacuum-size=100M

ジャーナルのサイズをトリミングするもう 1 つの方法は、--vacuum-timeオプションを使用することです。このオプションは、コマンドラインで指定した期間より古いメッセージを破棄するようにjournalctlに指示します。時間枠では、daysweeksmonthsyearsを使用できます。

1 週間より古いすべてのメッセージを削除してみましょう:

journalctl --vacuum-time=1weeks

データと情報

データは、アクセスして使用できない限り、役に立ちません。そうすると、それは有用な情報になります。journalctlコマンドは、柔軟で洗練されたツールであり、さまざまな方法で関心のある情報を入手できます。

必要なログ メッセージに絞り込むために、持っている情報をほとんどすべて使用できます。