ウェブサイト検索

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


重要なポイント

  • Linuxシステムのログ記録は、systemdの導入により変更され、システム、ブート、およびカーネルのログファイルをバイナリ形式で集中管理します。
  • journalctlコマンドは、システムログメッセージを読み取り、フィルタリングするために使用され、ユーザーがログをナビゲートおよび検索できるようにします。
  • ユーザーは、特定のログの詳細に焦点を当てるために、短縮形式、JSON、詳細形式、またはcatなどの異なる出力形式を使用して、journalctlの出力表示形式をカスタマイズできます。

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

中央集中的なログ管理

論争には馴染みのあるsystemdシステムおよびサービスマネージャは、システムログの収集方法に重要な変更をもたらしました。ログは、生成しているサービスやデーモンに応じてファイルシステムの異なる場所にありました。しかし、それらには一つの共通点がありました。それは、すべてプレーンテキストファイルであることです。

systemdを使用すると、すべてのシステム、ブート、カーネルのログファイルが中央の専用ログ処理ソリューションによって収集され、管理されます。保存される形式はバイナリです。これにより、JSONなどの異なる形式でデータを抽出できるようになります。さらに、以前は別々のログファイルに記録されていた関連情報を照合するのも容易になります。データが単一のジャーナルに保存されるため、興味のある複数のソースからのデータを選択し、単一の交差したエントリーリストに表示できます。

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

ジャーナルコントロール フリルなしで

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

journalctl

journalctlは、最も古いエントリがリストの先頭に表示される、全てのジャーナルを表示します。リストはlessで表示され、lessの通常のナビゲーション機能を使ってページ送りや検索ができます。また、左矢印キーと右矢印キーを使って、広いログエントリを左右にスクロールして読むこともできます。

Endキーを押すと、リストの一番下に直接移動し、新しいログエントリに飛びます。

終了するには、Ctrl+Cを押してください。

「journalctl」はsudoを使用せずに呼び出すこともできますが、sudoを使用するとログ内のすべての詳細を見ることができます。

sudo journalctl

必要な場合は、--no-pagerオプションを使用して、journalctlの出力を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

多くの可能なフィールドがありますが、すべてのフィールドがメッセージに存在することは稀です。

議論する価値のある一つの分野はPriorityフィールドです。この例では、その値は6です。この値は、メッセージの重要性を表しています:

  • 0: 緊急。システムが使用できません。
  • 1: 警告。すぐに修正すべき条件が flagged されています。
  • 2: 重大。これにはクラッシュ、コアダンプ、および主要なアプリケーションの重大な障害が含まれます。
  • 3: エラー。エラーが報告されましたが、深刻ではないと見なされています。
  • 4: 警告。この条件に注意を向ける必要があります。無視すると、エラーになる可能性があります。
  • 5: 注意。異常な事象を報告するために使用されますが、エラーではありません。
  • 6: 情報。定期的な運用メッセージ。これらはアクションを必要としません。
  • 7: デバッグ。アプリケーションをデバッグしやすくするためにアプリケーションに入れるメッセージ。

出力を適切に形成されたJavaScriptオブジェクト表記(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(以降)および -U(まで)オプションを使用します。

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

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

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

報告したい期間を定義するには、-S(開始)と-U(終了)オプションを一緒に使用します。このコマンドは15分の時間枠内のログメッセージを確認します。

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

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

相対的な時間の期間を使用して

時間の期間を選択する際に、相対アドレッシングを使用できます。つまり、「1日前から今までのすべてのイベントを表示して」といったことが言えます。これがこのコマンドの意味です。「d」は「日」を表し、「-1」は過去1日を意味します。

sudo journalctl -S -1d

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

最近起こったことを調査したい場合は、時間単位で測定された相対的な期間を指定できます。ここでは、最後の1時間のログメッセージを確認しています:

sudo journalctl -S -1h

最後の1時間のメッセージが表示されています。相対的な時間を分単位で設定するには「m」を、週単位で設定するには「w」を使用することもできます。

journalctl は today、yesterday、および tomorrow を理解します。これらの修飾子は、一般的な時間帯を指定する便利な方法を提供します。昨日発生したすべてのイベントを表示するには、次のコマンドを使用します:

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に関連するメッセージのみが表示されます:

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

sudo journalctl /usr/bin/anacron

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

検索を容易にするために、journalctlに対して、ジャーナルフィールドのいずれかに保持されているすべての値をリストするように依頼できます。

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

journalctl -F _UID

もう一度やって、グループID(GID)を見てみましょう。

journalctl -F _GID

これをジャーナルフィールド識別子のいずれかで行うことができます。

カーネルメッセージのリスト

カーネルメッセージを迅速にisolatするための組み込みの方法があります。自分で検索してisolatする必要はありません。-k(カーネル)オプションを使用すると、他のすべてのメッセージが削除され、カーネルログエントリの瞬時のビューが得られます。

sudo journalctl -k

強調は、Priorityフィールドの値に基づいて、メッセージの重要性を反映しています。

ブートメッセージのレビュー

ブートに関する問題を調査したい場合は、journalctlが役立ちます。新しいハードウェアを追加したが反応しない、または以前は正常に動作していたハードウェアコンポーネントが最後のシステムアップグレード後に動作しなくなった可能性があります。

最後のブートに関連するログエントリを見るには、-b(ブート)オプションを使用してください:

journalctl -b

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

"最後のブート"とは、現在ログインしているセッションのためにコンピュータを起動したブートプロセスを指します。過去のブートを確認するには、数字を使ってjournalctlに興味のあるブートを指定することができます。3回前のブートを見るには、次のコマンドを使用します:

journalctl -b 3

一般に、問題が発生してコンピュータを再起動する必要があった場合、関心があるのは以前の起動シーケンスです。したがって、これは一般的なコマンド形式です。

ブートの順序が混乱するのは簡単です。これを助けるために、journalctlに対して、--list-bootsオプションを使用して、そのジャーナルに記録されているブートをリストするように頼むことができます。

journalctl --list-boots

ブートのメッセージを確認したい場合は、日付と時刻のスタンプからブートを特定し、左側の列の番号を使用してそのブートシーケンスのログメッセージを取得できます。また、32ビットのブート識別子を選択し、それをjournalctlに渡すこともできます。

sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7

リクエストしたブートシーケンスからのログメッセージが取得され、表示されます。

ジャーナルハードドライブスペースの管理

もちろん、ジャーナルとそのすべてのログメッセージはあなたのハードドライブに保存されています。それは、ハードドライブのスペースを占有していることを意味します。ジャーナルによってどれだけのスペースが占有されているかを見るには、--disk-usage オプションを使用してください。

journalctl --disk-usage

今日のハードドライブでは、152 MBはまったく大きなスペースではありませんが、デモンストレーションの目的のために、まだそれを削減します。これを行う方法は2つあります。最初の方法は、ジャーナルを削減したいサイズの制限を設定することです。もちろん、それは再び成長しますが、新しい成長の準備として今すぐ剪定することができます。

素晴らしいタイトルの --vacuum-size オプションを使用し、ジャーナルを縮小したいサイズを指定します。100 MBを要求します。これは、journalctl に「できるだけ捨ててください、でも100 MBを下回らないでください」とお願いしていると考えてください。

journalctl --vacuum-size=100M

ジャーナルサイズを縮小するもう一つの方法は、--vacuum-timeオプションを使用することです。このオプションは、journalctlに、コマンドラインで指定した期間よりも古いメッセージを破棄するよう指示します。期間には日、週、月、および年を使用できます。

1週間以上前のメッセージをすべて排除しましょう:

journalctl --vacuum-time=1weeks

データと情報

データは、それにアクセスして利用できる場合にのみ役に立ちます。そうすれば、それは有用な情報になります。journalctlコマンドは、さまざまな方法で興味のある情報にアクセスできる柔軟で洗練されたツールです。

あなたが持っているほとんどすべての情報のスニペットを使用して、必要なログメッセージに焦点を合わせることができます。

Linuxコマンド

ファイル

t

プロセス

A

ネットワーキング

netstat・ping・traceroute・ip・ss・whois・fail2ban・bmon・dig・finger・nmap・ftp・curl・wget・who・whoami・w・iptables・ssh-keygen・ufw・arping・firewalld

関連記事: