'tail' コマンドで Linux ログファイルのリアルタイムな変更を監視する方法

LinuxBeginner
オンラインで実践に進む

はじめに

Linux のログは、システム監視とトラブルシューティングの要であり、システムの内部動作に関する貴重な洞察を提供します。このチュートリアルでは、Linux ログの基本的な概念と、多用途な 'tail' コマンドを使用してそれらを効果的に監視する方法について説明します。

ログファイルがどこに保存されているか、その内容を表示する方法、リアルタイムの変更を追跡する方法、および特定の情報を抽出する方法を学びます。これらのスキルは、Linux システムを扱うすべての人にとって不可欠であり、問題の診断、システムの健全性の監視、およびシステムがバックグラウンドで何をしているのかを理解するのに役立ちます。

Linux ログファイルとその場所の理解

Linux システムは、ログファイルと呼ばれる特殊なテキストファイルに、さまざまなアクティビティ、エラー、およびイベントの詳細な記録を保持しています。これらのログは、問題のトラブルシューティングやシステムの健全性の監視を行う際の主要な情報源として機能します。

Linux ログはどこに保存されていますか?

Ubuntu 22.04 を含むほとんどの Linux ディストリビューションは、ログファイルを /var/log ディレクトリに保存します。このディレクトリを調べて、システムで利用可能なログファイルを確認しましょう。

ターミナルを開き、次のコマンドを入力します。

ls -l /var/log

次のような出力が表示されるはずです。

total 1048
drwxr-x---  2 root   adm      4096 May  2 09:52 apache2
drwxr-xr-x  2 root   root     4096 Apr 30 15:27 apt
-rw-r-----  1 syslog adm    183867 May  2 10:18 auth.log
-rw-r--r--  1 root   root     1112 Nov 17  2022 alternatives.log
drwxr-xr-x  2 root   root     4096 Apr 20  2022 cups
-rw-r-----  1 syslog adm    308342 May  2 10:18 kern.log
-rw-rw-r--  1 root   utmp        0 Apr 20  2022 lastlog
drwxr-xr-x  2 root   root     4096 Nov  8  2022 nginx
-rw-r-----  1 syslog adm    473079 May  2 10:18 syslog

正確なファイルとディレクトリは、システムにインストールされているソフトウェアによって異なります。

一般的なログファイルとその内容

以下は、遭遇する可能性のある最も重要なログファイルの一部です。

  • /var/log/syslog: 一般的なシステムメッセージが含まれています
  • /var/log/auth.log: 認証試行とユーザー管理を記録します
  • /var/log/kern.log: カーネルメッセージとエラーが含まれています
  • /var/log/apt: パッケージ管理ログを含むディレクトリ

これらのファイルの 1 つの内容を調べてみましょう。ログ監視について学んでいるので、システムログの基本的なビューから始めます。

sudo head -n 20 /var/log/syslog

head コマンドは、ファイルの最初の数行 (この場合は 20 行) を表示します。一部のログファイルは管理者権限を持つユーザーのみが読み取ることができるため、sudo を使用します。

次のような出力が表示されるはずです。

May  2 08:23:15 ubuntu systemd[1]: Started Daily apt download activities.
May  2 08:23:15 ubuntu systemd[1]: Starting Daily apt upgrade and clean activities...
May  2 08:23:15 ubuntu systemd[1]: apt-daily-upgrade.service: Deactivated successfully.
May  2 08:23:15 ubuntu systemd[1]: Finished Daily apt upgrade and clean activities.
May  2 08:37:16 ubuntu systemd[1]: Starting Message of the Day...
May  2 08:37:16 ubuntu systemd[1]: motd-news.service: Deactivated successfully.
May  2 08:37:16 ubuntu systemd[1]: Finished Message of the Day.
...

各ログエントリの形式に注目してください。

  • 日付と時刻
  • ホスト名 (この例では ubuntu)
  • ログを生成しているプログラムまたはサービス
  • 実際のログメッセージ

ログエントリ構造の理解

ほとんどのログエントリは標準形式に従っており、読みやすく処理しやすくなっています。一般的な形式には以下が含まれます。

  1. タイムスタンプ (Timestamp): イベントが発生したとき
  2. ホスト名 (Hostname): マシンの名前
  3. サービス/アプリケーション (Service/Application): ログを生成したもの
  4. メッセージ (Message): 実際に何が起こったかに関する情報

ログの場所と構造を理解したので、tail コマンドを使用してログファイルの最新のエントリを表示することに進みましょう。

ログファイルを表示するための基本的な 'tail' コマンドの使用

head コマンドがファイルの先頭を表示するのに対し、tail コマンドはファイルの末尾を表示します。これは、最新のエントリが通常末尾にあるため、ログファイルに特に役立ちます。

'tail' コマンドの基本的な使用法

tail コマンドの基本的な構文は次のとおりです。

tail [options] [file]

デフォルトでは、tail はファイルの最後の 10 行を表示します。システムログで試してみましょう。

sudo tail /var/log/syslog

最新の 10 個のログエントリが表示されるはずです。

May  2 10:15:32 ubuntu systemd[1]: Starting Clean php session files...
May  2 10:15:32 ubuntu systemd[1]: phpsessionclean.service: Deactivated successfully.
May  2 10:15:32 ubuntu systemd[1]: Finished Clean php session files.
May  2 10:17:01 ubuntu CRON[8752]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)
May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

カスタム行数の表示

場合によっては、必要なコンテキストを得るために 10 行では十分でないことがあります。-n オプションを使用して、表示する行数を指定できます。

sudo tail -n 5 /var/log/syslog

これにより、ファイルの最後の 5 行のみが表示されます。

May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:14 ubuntu systemd[1]: Started Session 4 of User labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413

認証ログの表示

/var/log/auth.log ファイルには、ユーザー認証とセキュリティ関連のイベントに関する情報が含まれています。最新のエントリを見てみましょう。

sudo tail -n 15 /var/log/auth.log

次のような出力が表示される場合があります。

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:14 ubuntu systemd-logind[698]: New session 4 of user labex.
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex
May  2 10:18:15 ubuntu systemd-logind[698]: Session 4 logged out. Waiting for processes to exit.
May  2 10:18:15 ubuntu systemd-logind[698]: Removed session 4.
May  2 10:20:01 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail /var/log/syslog
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:20:01 ubuntu sudo: pam_unix(sudo:session): session closed for user root
May  2 10:21:15 ubuntu sudo:    labex : TTY=pts/0 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/syslog
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:21:15 ubuntu sudo: pam_unix(sudo:session): session closed for user root

このログは、ユーザーのログイン試行、セッションの開始と終了、および sudo コマンドの使用状況を示しています。セキュリティ監視とユーザーアクセスに関する問題のトラブルシューティングに不可欠なログです。

カーネルログの確認

カーネルは Linux オペレーティングシステムの中心です。/var/log/kern.log ファイルには、カーネルによって生成されたメッセージが含まれており、ハードウェアとドライバーの問題の診断に役立ちます。

sudo tail -n 10 /var/log/kern.log

出力は次のようになります。

May  2 09:15:02 ubuntu kernel: [16789.456123] USB 1-1: new high-speed USB device number 3 using xhci_hcd
May  2 09:15:02 ubuntu kernel: [16789.605432] usb 1-1: New USB device found, idVendor=0781, idProduct=5571, bcdDevice= 1.00
May  2 09:15:02 ubuntu kernel: [16789.605436] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
May  2 09:15:02 ubuntu kernel: [16789.605438] usb 1-1: Product: Ultra
May  2 09:15:02 ubuntu kernel: [16789.605440] usb 1-1: Manufacturer: SanDisk
May  2 09:15:02 ubuntu kernel: [16789.605442] usb 1-1: SerialNumber: 4C530001211124120222
May  2 09:15:02 ubuntu kernel: [16789.606521] usb-storage 1-1:1.0: USB Mass Storage device detected
May  2 09:15:02 ubuntu kernel: [16789.606705] scsi host3: usb-storage 1-1:1.0
May  2 09:15:03 ubuntu kernel: [16790.624553] scsi 3:0:0:0: Direct-Access     SanDisk  Ultra            1.00 PQ: 0 ANSI: 6
May  2 09:15:03 ubuntu kernel: [16790.625045] sd 3:0:0:0: Attached scsi generic sg1 type 0

ログファイルの最新のエントリを表示する方法を理解したので、tail コマンドの最も強力な機能の 1 つである、ログをリアルタイムで監視することに進みましょう。

'tail -f' を使用したリアルタイムログ監視

tail コマンドの最も強力な機能の 1 つは、-f オプション (「follow」の略) を使用してファイルをリアルタイムで監視できることです。これは、新しいエントリが追加されるときにログファイルを観察するのに特に役立ち、トラブルシューティングと監視に役立ちます。

'tail -f' の理解

-f オプションは、tail に対してファイルを開いたままにし、ファイルに追加された新しい行を継続的に表示するように指示します。これにより、ログファイルのリアルタイムビューが作成され、イベントの発生をリアルタイムで確認できます。

システムログのリアルタイム監視

-f オプションを使用して、システムログをリアルタイムで監視してみましょう。

sudo tail -f /var/log/syslog

このコマンドを実行すると、ログファイルの最新のエントリが表示され、ターミナルは開いたままで、新しいエントリが表示されるたびに表示されます。

いくつかのログエントリを生成するために、新しいターミナルウィンドウを開き (新しいターミナルを開くには Ctrl+Alt+T を押します)、いくつかの基本的なコマンドを実行します。

logger "This is a test message from user $(whoami)"

logger コマンドは、システムログにメッセージを送信します。次に、tail -f を実行している最初のターミナルウィンドウに戻ると、テストメッセージがログに表示されるはずです。

May  2 10:34:45 ubuntu labex: This is a test message from user labex

logger コマンドを異なるメッセージでさらに数回実行して、それらがリアルタイムで表示されるのを確認してください。

logger "System test number 2"
logger "Monitoring logs is fun!"

これらの各メッセージは、ログに記録されると、tail -f 出力ウィンドウに表示されるはずです。

ログの監視が完了したら、Ctrl+C を押して tail -f コマンドを停止し、コマンドプロンプトに戻ります。

認証アクティビティの監視

ログインと認証関連のイベントを観察するために、認証ログを監視してみましょう。

sudo tail -f /var/log/auth.log

これにより、ユーザーログイン、sudo コマンドの使用状況、認証の失敗など、リアルタイムの認証アクティビティが表示されます。

いくつかの認証ログエントリを生成するには、新しいターミナルを開き、sudo コマンドを実行します。

sudo ls /root

tail -f ウィンドウに、sudo アクティビティを示す新しいエントリが表示されるはずです。

May  2 10:38:23 ubuntu sudo:    labex : TTY=pts/1 ; PWD=/home/labex ; USER=root ; COMMAND=/usr/bin/ls /root
May  2 10:38:23 ubuntu sudo: pam_unix(sudo:session): session opened for user root(uid=0) by labex(uid=1000)
May  2 10:38:23 ubuntu sudo: pam_unix(sudo:session): session closed for user root

ここでも、観察が完了したら、Ctrl+C を押して tail -f コマンドを停止します。

リアルタイムログ監視の実用的なユースケース

リアルタイムログ監視は、いくつかのシナリオで非常に役立ちます。

  1. 問題のトラブルシューティング: 何かが機能しない場合、ログをリアルタイムで監視すると、問題の特定に役立ちます。
  2. セキュリティ監視: 認証ログを監視すると、不正なアクセス試行を検出できます。
  3. アプリケーションデバッグ: 開発者は、テスト中に何が起こっているかを理解するために、アプリケーションログを監視できます。
  4. システム管理: 管理者は、メンテナンスまたは構成変更中にシステムログを監視できます。

たとえば、ネットワークの問題をトラブルシューティングしている場合、接続を試みながらシステムログを監視して、表示されるエラーメッセージを確認することができます。

tail -f を使用したリアルタイムログ監視を習得することで、システムの動作をリアルタイムで理解するための強力なツールが得られます。

より良い分析のためのログ情報のフィルタリング

ログファイルは非常に大きくなる可能性があり、多くの情報が含まれています。ログ分析をより管理しやすくするために、tail コマンドを grep などの他のツールと組み合わせて、特定の情報をフィルタリングして見つけることができます。

'grep' と 'tail' の使用

grep コマンドは、テキスト内のパターンを検索します。tail と組み合わせると、特定のキーワードまたはパターンでログエントリをフィルタリングできます。基本的な構文は次のとおりです。

tail [options] [file] | grep "pattern"

いくつかの実用的な例を見てみましょう。

エラーメッセージの検索

システムログでエラーメッセージを見つけるには、単語 "error" でフィルタリングできます。

sudo tail -n 100 /var/log/syslog | grep -i "error"

grep-i オプションは、検索で大文字と小文字を区別しないようにするため、"error"、"Error"、"ERROR" などに一致します。次のような出力が表示される場合があります。

May  2 09:23:45 ubuntu systemd[1]: Failed to start Apache HTTP Server: Job failed with error code.
May  2 09:45:12 ubuntu kernel: [12345.678901] Buffer I/O error on device sdb1, logical block 123456

結果が表示されない場合は、ログの最後の 100 行にエラーメッセージがないことを意味します。

特定のサービスの監視

特定のサービスまたはプログラムを監視するために、ログをフィルタリングすることもできます。たとえば、SSH 関連のアクティビティを監視するには、次のようにします。

sudo tail -n 100 /var/log/auth.log | grep "sshd"

これにより、認証ログの SSH 関連のエントリのみが表示されます。

May  2 10:18:14 ubuntu sshd[8755]: Accepted password for labex from 192.168.1.5 port 52413 ssh2
May  2 10:18:14 ubuntu sshd[8755]: pam_unix(sshd:session): session opened for user labex(uid=1000) by (uid=0)
May  2 10:18:15 ubuntu sshd[8789]: Received disconnect from 192.168.1.5 port 52413:11: disconnected by user
May  2 10:18:15 ubuntu sshd[8789]: Disconnected from user labex 192.168.1.5 port 52413
May  2 10:18:15 ubuntu sshd[8755]: pam_unix(sshd:session): session closed for user labex

リアルタイムフィルタリング監視

リアルタイム監視とフィルタリングを組み合わせて、特定のイベントが発生したときに監視することもできます。

sudo tail -f /var/log/syslog | grep --line-buffered "test"

--line-buffered オプションは、grep がバッファリングするのではなく、一致する各行を直ちに出力するようにします。これは、tail -f を使用する場合に重要です。

次に、別のターミナルでテストログメッセージを生成します。

logger "This is a test message for grep filtering"

最初のターミナルでは、"test" の grep フィルタリングのために、このメッセージのみが表示されるはずです (他のログメッセージは表示されません)。

複数のパターンを使用した高度なフィルタリング

OR 演算子 (|) を使用して、複数のパターンを検索することもできます。

sudo tail -n 100 /var/log/syslog | grep -E "error|warning|critical"

-E オプションは拡張正規表現を有効にし、OR 演算子の使用を可能にします。このコマンドは、"error"、"warning"、または "critical" のいずれかの単語を含む行を表示します。

'awk' を使用した特定の情報の抽出

より高度なフィルタリングとフォーマットには、awk コマンドを使用できます。たとえば、syslog から時間とメッセージのみを抽出するには、次のようにします。

sudo tail -n 10 /var/log/syslog | awk '{print $3, $5, $6, $7, $8, $9, $10}'

これにより、各ログエントリから特定のフィールドが抽出され、最も関連性の高い情報に焦点を当てやすくなります。

これらのフィルタリング技術を習得することで、大きなログファイルを効率的に分析し、トラブルシューティングと監視に必要な情報を正確に抽出できます。

まとめ

tail コマンドを使用して Linux ログファイルのリアルタイムな変更を監視するこの実験を完了したことをおめでとうございます。いくつかの重要なスキルを習得しました。

  1. Linux ログファイルの理解: ログがどこに保存されているか、何が含まれているか、ログエントリがどのように構造化されているかを理解できるようになりました。

  2. 基本的なログ表示: tail コマンドを使用して、ログファイルの最新のエントリを表示し、表示する行数を指定できます。

  3. リアルタイム監視: tail -f を使用すると、ログが更新されるときにログを監視できるため、システムの活動を観察し、発生した問題をトラブルシューティングできます。

  4. ログ情報のフィルタリング: tailgrepawk などのツールと組み合わせることで、ログから特定の情報を抽出でき、分析をより効率的に行うことができます。

これらのスキルは、初心者から経験豊富な管理者まで、Linux システムを扱うすべての人にとって不可欠です。ログ分析は、システムのメンテナンス、トラブルシューティング、およびセキュリティ監視の基本的な部分です。

Linux の旅を続ける中で、これらのログ監視技術が、システムをより深く理解し、問題をより迅速に診断し、より安全で信頼性の高い環境を維持するのに役立つことがわかるでしょう。