'tail'を使ってLinuxログファイルのリアルタイムな変更を監視する方法

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

はじめに

Linuxのログは、システム監視やトラブルシューティングを支える重要な基盤です。システム内部で何が起きているのかを知るための貴重な情報を提供します。このチュートリアルでは、Linuxログの基本概念と、汎用性の高い'tail'コマンドを使ってログを効率的に監視する方法を学びます。

ログファイルの保存場所、内容の確認方法、リアルタイムでの変更の追跡方法、特定の情報の抽出方法を身につけます。これらのスキルはLinuxシステムを扱うすべての人にとって不可欠です。問題の診断、システムの健全性の監視、そしてシステムの裏側で何が起きているかの理解に役立ちます。

Linuxログファイルと保存場所を理解する

このステップでは、/var/logを確認し、一般的なシステムログエントリの構造を調べます。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を用意しているため、各コマンドを一貫して練習できます。

代表的なログファイルとその内容

Linuxでよく利用する重要なログファイルには、次のようなものがあります。

  • /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)
  • ログを生成したプログラムまたはサービス
  • 実際のログメッセージ

ログエントリの構造を理解する

多くのログエントリは標準的な形式に従っているため、読み取りや処理が簡単です。一般的な形式には、次の要素が含まれます。

  • タイムスタンプ: イベントが発生した時刻
  • ホスト名: マシンの名前
  • サービス/アプリケーション: ログを生成したもの
  • メッセージ: 発生した事象に関する実際の情報

ログの保存場所と構造を理解できたところで、次はtailコマンドを使ってログファイルの最新エントリを確認します。

基本的な'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'でログをリアルタイム監視する

このステップでは、ログファイルを追跡し、新しいエントリが追加された瞬間に確認します。-fオプション(「follow」の略)を使うと、ファイルを開いたまま、新しく追加された行を表示できます。トラブルシューティングや監視に便利な機能です。

'tail -f'の仕組みを理解する

-fオプションを指定すると、tailはファイルを開いたままにし、新しい行が追加されるたびに継続して表示します。これにより、ログファイルをリアルタイムで確認でき、イベントの発生をその場で把握できます。

システムログをリアルタイムで監視する

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

sudo tail -f /var/log/syslog

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

ログエントリを生成するため、新しいターミナルウィンドウを開き(Ctrl+Alt+Tを押します)、テストメッセージを追加します。

echo "$(date '+%b %e %T') ubuntu $(whoami): This is a test message from user $(whoami)" | sudo tee -a /var/log/syslog

tee -aは、メッセージを練習用のシステムログに追記します。最初のターミナルに戻ると、tail -fを実行している画面にテストメッセージが表示されます。

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

さらにいくつかメッセージを追加して、リアルタイムで表示されることを確認します。

echo "$(date '+%b %e %T') ubuntu labex: System test number 2" | sudo tee -a /var/log/syslog
echo "$(date '+%b %e %T') ubuntu labex: Monitoring logs is fun!" | sudo tee -a /var/log/syslog

これらのメッセージは、ログに記録されると同時にtail -fを実行している画面に表示されます。

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

認証アクティビティを監視する

認証ログを監視して、ログインや認証に関するイベントを確認してみましょう。

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

ユーザーのログイン、sudoコマンドの使用、認証失敗など、認証に関する活動がリアルタイムで表示されます。

認証イベント形式のエントリを生成するため、新しいターミナルを開き、サンプルイベントを追加します。

echo "$(date '+%b %e %T') ubuntu sudo: labex ran /usr/bin/ls /root" | sudo tee -a /var/log/auth.log

tail -fを実行している画面に新しいエントリが表示されます。

May  2 10:38:23 ubuntu sudo: labex ran /usr/bin/ls /root

確認が終わったら、もう一度Ctrl+Cを押してtail -fを停止します。

ログのリアルタイム監視が役立つ場面

ログのリアルタイム監視は、さまざまな場面で非常に役立ちます。

  • 問題のトラブルシューティング: 何かが正常に動作しないとき、ログをリアルタイムで確認すると原因の特定に役立ちます。
  • セキュリティ監視: 認証ログを監視することで、不正アクセスの試行を検出できます。
  • アプリケーションのデバッグ: 開発者はアプリケーションログを確認し、テスト中に何が起きているかを把握できます。
  • システム管理: 管理者は、メンテナンスや設定変更の際にシステムログを監視できます。

たとえばネットワークの問題を調査する場合、接続を試しながらシステムログを監視し、発生したエラーメッセージを確認できます。

tail -fによるリアルタイムログ監視を使いこなせば、システムの動作を発生したその場で理解するための強力な手段を得られます。

ログ情報をフィルタリングして分析しやすくする

このステップでは、tailgrepawkと組み合わせ、必要なログエントリだけに焦点を当てます。これらのフィルターを使うと、大量のログファイルから必要な情報だけを選択・整形できるため、分析しやすくなります。

'tail'と'grep'を組み合わせる

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と組み合わせる場合に重要な設定です。

次に、別のターミナルで一致するテストメッセージを追加します。

echo "$(date '+%b %e %T') ubuntu labex: This is a test message for grep filtering" | sudo tee -a /var/log/syslog

最初のターミナルには、grepで"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の学習を続ける中で、ここで学んだログ監視の技術が、システムへの理解を深め、問題をより迅速に診断し、安全で信頼性の高い環境を維持するうえで役立つことが分かるでしょう。