システムでエラーが発生していないからといって、すべてが正常に機能しているとは限りません。 Linux システム ログを読んで分析し、システムで何が起こっているかを確認してみませんか?方法がわからない?幸運なことに、Journalctl はその役目を果たします!
このチュートリアルでは、systemd のジャーナル ログ ファイルを読み取って分析することにより、journalctl ツールを使用してシステムの動作を注意深く監視する方法を学習します。
読み進めて、システムを最高の状態に保ちましょう!
前提条件
このチュートリアルは実践的なデモンストレーションです。フォローしたい場合は、次のものがあることを確認してください。
- Linux マシン – このデモでは Ubuntu 20.04 LTS を使用していますが、任意のディストリビューションを使用できます。
- sudo 権限を持つ root 以外のアカウント
正しいシステム時刻の設定
Journalctl を使用する前に、システム時刻を設定する必要があります。 systemd ジャーナルに記録されるタイムスタンプは UTC であるため、正しいタイム ゾーンを選択する必要があります。時間が数秒ずれていると、後でログ エントリを使用したときに一部のログ エントリが正しく表示されない場合があります。
1. ターミナルを開き、timedatectl
を実行します 以下のコマンドを実行して、利用可能なタイム ゾーンのリストを取得します。
timedatectl list-timezones
以下に示すリストから、お住まいの地域に一致するものを 1 つ選んでメモしてください。たとえば、アメリカに住んでいる場合は、あなたの都市に最も近いタイム ゾーンを選択してください。
2. 次に、以下のコマンドを実行してタイムゾーンを設定します (set-timezone
)。 your-zone
を置き換えます 前に選択したタイム ゾーンの名前 (手順 1) を使用します。このコマンドは、システム時刻を選択したタイム ゾーンに設定します。
今後は、すべてのログ エントリが現地時間として記録されます。
sudo timedatectl set-timezone your-zone
3. 最後に、次のコマンドを実行して、タイム ゾーンが正しく設定されていることを確認します。
timedatectl status
以下に示すように、現在のシステムの日付と時刻は、選択した地域とタイム ゾーンと一致する必要があります。
すべてのログを表示する
タイムゾーンの設定は終わったので、システムでログの表示を開始できます。 systemd System and Service Manager は、システム上のさまざまな部分/ツールからログを収集するログ デーモンの集中管理を提供します。
しかし、ログをどのように表示しますか? journalctl ユーティリティを使用すると、マシンのログを表示できます。通常、最初に行うことは、最後の起動以降に発生したすべてを表示することです。
journalctl
を実行します 以下のコマンドを実行して、journald デーモンのすべてのログを表示してください。
journalctl ユーティリティは、systemd ジャーナルを収集および表示するための、journald デーモンのコマンドライン インターフェイスを実装します。 journalctl ユーティリティを使用すると、ユーザーは systemd が管理する任意のユニット (サービス、プロセスなど) のアクティビティとステータスを調べることができます。
sudo journalctl
このコマンドは、以下に示すジャーナル全体を表示しますが、少し読みにくいです。最も古いログがリストの一番上にあり、最新のログが一番下にあります。
systemd ジャーナルがログを十分に長く記録している場合、おそらく数百または数千のエントリがあるでしょう。
他のパラメーターを使用してログをフィルター処理できますが、そのトピックはこのチュートリアルの範囲外であるため、ここではそれらのフィルターについて説明しません。
リストをより選択的にブラウズしたい可能性が高いため、ページの上/下の矢印が便利です。 K を押します ページをジャンプして J ページを下にジャンプします。 END を押します 最後のページにジャンプします。
「正しいシステム時刻の設定」セクション (ステップ 2) でタイムゾーンを設定しているため、各エントリの先頭にあるタイムスタンプは現地時間であることに注意してください。
ジャーナルを持続的にする
すべてのログを表示する方法を見てきましたが、通常はログを長期間保持したいので、めったに発生しない問題に関するデータを見つける機会が増えます。どのように?ジャーナルを永続化することによって。
/run/log/journal/ directory はログ データのデフォルトの場所であり、デフォルトでは永続的ではありません。システムを再起動するとすぐに、すべてのログが消えます。永続ログの考え方は、すべてのログ ファイルを保持することですが、古いログは大きくなりすぎるとアーカイブされます。
ジャーナルをブート間で永続化するには、/etc/systemd/journald.conf を編集します。
1. /etc/systemd/journald.conf を開きます 任意のテキスト エディターでファイルを作成し、Storage=auto
を探します。 以下に示すように、ディレクティブ。
2. 次に、ストレージを変更します auto からのディレクティブの値 しつこい をクリックし、変更を保存してエディターを閉じます。 ストレージを保管してください ディレクティブを 1 行で入力し、ディレクティブと値の間にスペースを入れないでください。そうしないと、構成が機能しません。
3. 次のコマンドを実行して、systemd-journald
を再起動します。 すべての変更を有効にするサービス。このコマンドは出力を出力しませんが、このコマンドが完了したら、マシンを再起動して別のターミナルを開きます。
この時点で、systemd は /run/log/journal を無視します。 代わりに、ジャーナル データを /var/log/journal に保存します。 ディレクトリに保存されるため、ログ ジャーナルはブート間で永続化されます。
systemd-journald
を起動すると /var/log/journal ディレクトリが存在しない場合は、自動的に作成されます。
sudo systemctl restart systemd-journald
4. 次に、以下のコマンドを実行して systemd-journald.service
のステータスを確認します .
sudo systemctl status systemd-journald.service
以下に示すように、構成が機能している場合は、アクティブ (実行中) のステータスが表示されます。以下の出力は、ジャーナルが意図したとおりに実行されていることを確認します。
5. ls
を実行します 以下のコマンドで /var/log/journal
かどうかを確認します ディレクトリが存在します。
ls /var/log/journal
次の出力が表示されます。これは永続ジャーナルの UUID です。この UUID には特別な意味はなく、ブート プロセス中に生成されるランダムな一意の文字列です。この文字列は、/var/log/journal のデータを参照するために使用できる識別子です .
ログ ジャーナルを一覧表示するために使用するので、UUID を書き留めておきます (ステップ 6)。
6. 最後に、以下のコマンドを実行して、ログ ジャーナルを一覧表示します。 myUUID
を必ず置き換えてください 以前にメモした UUID を使用します (ステップ 5)。
ls /var/log/journal/myUUID
以下同様に、前回の起動からのジャーナルが表示されます。この時点で、永続的なログ システムが完成しました!
現在のブートからジャーナル エントリを一覧表示する
すべてのログ エントリを表示する方法を学習しました。しかし、特定の種類のログを除外したい場合もあります。その場合は、カーネル ログ エントリのみを表示することをお勧めします。
journalctl ツールには、特定の種類のログ エントリを表示できる強力なフィルタリング構文があります。または、元のサービスのプロセス ID (PID) やユニット名などの関連情報を表示することもできます。
ログを除外するにはさまざまな方法がありますが、現在のブートからジャーナルを表示することだけに関心があるかもしれません。もしそうなら、基本的な journalctl
コマンドでうまくいきます。
journalctl
を実行します 以下のコマンドを実行して、現在のブート (-b
) のすべてのジャーナル エントリを一覧表示します。 ) 現在のシステム/環境に関連します。 -b
フラグは journalctl
を示します 最後のシステム起動以降、journald によって保存されたログを表示するコマンド。
journalctl -b
過去のブーツのログを一覧表示する
journalctl
使用中 トラブルシューティングのために、特定の過去の起動のログ エントリを表示する必要がある場合もあります。おそらく、ある起動では起動するが、別の起動では失敗するサービスがあるとします。その場合、2 回目の起動からログ エントリを分離して、何が問題なのかを確認する必要があります。
1. 以下のコマンドを実行して、過去のブートのリストを表示します (–list-boots)。
journalctl --list-boots
以下に示すように、前のセクションで永続的なログを構成したため、journalctl は過去の起動をすべて表示します。
- リストの各行は、過去のブート ログ エントリを示します。最初の列は、各エントリを参照するために使用できるブーツのオフセットです。オフセットは数字 (-1, 0 ).
- 2 列目のブート ID を、ブート エントリへの絶対参照として使用することもできます。
2. 次に、journalctl -b -1
を実行します。 コマンドを使用して、ブート 1 (前回のブート) からのジャーナル エントリを表示します。ただし、ブート番号 (ブート 2、ブート 3 など) を変更することで、他のブートからのジャーナル エントリを表示することもできます。
journalctl -b -1
3. 最後に、以下のコマンドを実行して、同じブートからのジャーナル エントリを表示しますが、そのブート ID (boot_id
) によって参照されます。 )。 boot_id
を必ず置き換えてください ステップ 1 で書き留めたブート ID を使用します。
journalctl -b boot_id
タイム ウィンドウに基づくログの一覧表示
過去の起動からすべてのログを表示する方法を見てきましたが、特定のログを時間別に表示する必要がある場合はどうすればよいでしょうか? --since
の追加 と --until
オプションは、タイム ウィンドウに基づいてジャーナル ログ エントリをフィルタリングします。
journalctl
を実行します 以下のコマンドを実行して、特定の日時 (--since "2022-02-04 12:40:49”
) から 24 時間前に生成されたすべてのジャーナル エントリを検索します。 ).
journalctl --since "2022-02-04 12:40:49”
日付と時刻を指定するのが苦手なのかもしれません。その場合は、代わりに相対値と期間を使用してください。たとえば、「2 分」、「30 分」、「1 時間」、さらには「昨日」や「今」などの日などです。
以下のコマンドを実行して、現在の日時 (”yesterday”
) から 24 時間前以降のすべてのジャーナル エントリを表示します。 ).
journalctl --since "yesterday"
では、SSH サービスが今日の 10:10 から実行されていて、1 時間前に中断されるまで継続していたとしたらどうでしょうか?両方の --since
を追加 と --until
journalctl
のオプション
以下のコマンドを実行して、10:10
から生成されたログを見つけます 今日から 1 hour ago
まで .
journalctl --since 10:10 --until "1 hour ago"
元のプロセスの単位に基づくログのフィルタリング
特定の日付と時刻までに生成されたログを見つけることは、トラブルシューティングに役立ちますが、出力にはまだ多くのレコードが含まれる場合があります。ログをさらにフィルタリングするにはどうすればよいですか?
たとえば、ブート時に起動に失敗した NGINX Web サーバー ユニットからジャーナル エントリをフィルター処理したいとします。 journalctl
を使用 -unit
を使用したコマンド ログを表示するためのオプションとサービスのユニット名。
以下のコマンドを実行して、元のプロセスの単位 (-u
) に基づいてすべてのジャーナル エントリを一覧表示します。 ) (nginx.service
)。このタイプのフィルタリングは、特定のエラーまたは警告に関連するプロセスまたはサービスの PID を知るのに役立ちます。
journalctl -u nginx.service
おそらく、サービスのトラブルシューティング中のように、変更が発生したときに積極的に表示することを好み、journald によってロードされたときにログを表示する必要がある場合があります。その場合は、以下のコマンドを実行してリストまたはフォローします (-f
) 発生時にすべての変更。
journalctl -f
これまで、journalctl は柔軟性があり、ログをフィルタリングして表示するための多くのオプションがあることを見てきました。このチュートリアルですべての種類のフィルターと時間間隔を表示することは不可能ですが、
man journalctl
を実行できます。 コマンドを使用して、journalctl ツールが提供するその他のオプションを確認してください。
出力フォーマットのカスタマイズ
デフォルトでは、journalctl はログ エントリをページャーのような形式で表示し、出力時にターミナル テキストに色を付けます。しかし、標準化された、より解析可能な形式でログを出力したいと思うでしょう。その場合、任意のテキスト操作ツールを使用できます。
次のコマンドを実行して、ページングとカラーリングを抑制します。 journalctl ツールを使用すると、構成ファイルの出力ディレクティブを使用して stdout に表示する内容を指定できます。
journalctl --no-pager
ただし、出力形式を指定する場合は、-o
を追加します オプションを、journalctl コマンドに追加します。次の例では JSON 出力形式を使用していますが、journalctl で利用可能な他のオプションを使用できます。
以下のコマンドは、現在のブート (-b
) からのジャーナル エントリを一覧表示します。 ) NGINX サービス (nginx
用に生成) ) を実行し、JSON 形式 (-o json
) でリストを出力します。 ).
journalctl -b -u nginx -o json
カスタム出力形式
journalctl
を使用することもできます JSON、CSV、Syslog など、いくつかの便利な事前定義済みのものを提供します。これらの形式にはそれぞれメリットがありますが、テキストの処理方法の詳細については、テキスト操作ツールのページを参照してください。
結論
このチュートリアルでは、journalctl
の使い方を学びました。 systemd ジャーナル ログを表示するコマンド。ただし、これらのコマンドを使用する前に、適切なサブコマンド オプションを選択して、表示する内容を指定する必要があります。
この時点で、journalctl
を介してシステム ログ内の特定の情報をすばやく見つけて特定できるようになりました。 .これで必要な知識が身に付いたので、systemctl と journalctl を使用して Linux サービスを管理してみませんか?