Linuxサーバーで障害やエラーが発生したとき、ログファイルをリアルタイムに追跡できるかどうかで、原因特定のスピードが大きく変わります。catコマンドで毎回ファイルを開き直しているようでは、刻々と書き込まれるログを追いかけることはできません。
この記事では、tail -fコマンドによるリアルタイムログ監視の基本から、複数ファイルの同時監視、grepとの組み合わせによるフィルタリング、さらにログが流れない時のトラブルシュートまで、現場で使える実践テクニックを解説します。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
tail -fとは? ログをリアルタイムで追跡する仕組み
tailコマンドは、ファイルの末尾を表示するコマンドです。ここに-fオプション(follow)を付けると、ファイルの末尾を表示した後も終了せず、新しく追記された内容をリアルタイムで画面に出力し続けます。仕組みとしては、tailがファイルの末尾を監視し続け、書き込みが行われるたびに追加分を表示するという動作です。syslogやrsyslog、journaldなどのログデーモンがファイルに1行書き込むたびに、その内容が即座に画面に表示されます。
ログ監視を終了するには
Ctrl+Cを押してください。Linuxに慣れていない方がよくやるのがCtrl+Zで停止してしまうケースですが、これはプロセスを一時停止しただけでバックグラウンドに残り続けるため、必ずCtrl+Cで終了してください。基本的な使い方
1. /var/log/messagesをリアルタイムで監視する
もっとも基本的な使い方です。システムの汎用ログファイルである/var/log/messagesをリアルタイムで監視します。# /var/log/messagesをリアルタイムで監視する $ sudo tail -f /var/log/messages Mar 30 10:15:01 server01 systemd: Started Session 145 of user root. Mar 30 10:15:03 server01 kernel: TCP: request_sock_TCP: Possible SYN flooding on port 80. Mar 30 10:15:05 server01 sshd[12345]: Accepted publickey for admin from 192.168.1.10 port 55432 Mar 30 10:15:10 server01 crond[6789]: (root) CMD (/usr/local/bin/backup.sh)
※ /var/log/messages はroot権限でないと読めない場合が多いため、
sudoを付けて実行してください。2. 表示行数を指定して監視を開始する
デフォルトでは末尾10行から表示が始まりますが、-nオプションで表示開始行数を変更できます。# 末尾30行を表示してからリアルタイム監視を開始する $ sudo tail -n 30 -f /var/log/messages # 末尾0行(過去のログを表示せず)でリアルタイム監視を開始する $ sudo tail -n 0 -f /var/log/messages
-n 0が便利です。過去のログを遡りたい場合は-n 100のように大きめの数字を指定してください。3. Webサーバーのアクセスログを監視する
Apache HTTP ServerやNginxのアクセスログ・エラーログの監視は、サーバー運用でもっとも頻繁に行う作業のひとつです。# Apacheのアクセスログをリアルタイムで監視する $ sudo tail -f /var/log/httpd/access_log # Apacheのエラーログをリアルタイムで監視する $ sudo tail -f /var/log/httpd/error_log # Nginxのアクセスログをリアルタイムで監視する $ sudo tail -f /var/log/nginx/access.log
実務で使うtail -fの応用テクニック
1. grepと組み合わせて特定のログだけ表示する
ログファイルには大量の情報が流れてきます。特定のキーワードに絞って監視したい場合は、パイプでgrepに渡します。# "error"を含む行だけをリアルタイムで監視する $ sudo tail -f /var/log/messages | grep -i "error" # 特定のIPアドレスからのアクセスだけを監視する $ sudo tail -f /var/log/httpd/access_log | grep "192.168.1.100" # SSHのログイン試行だけを監視する $ sudo tail -f /var/log/secure | grep "sshd"
grep -iを使うと大文字・小文字を区別せずにマッチするため、ERRORもerrorもErrorも拾えます。障害対応時はgrep -i "error\|fail\|denied"のように複数キーワードをまとめて指定すると効率的です。2. 複数のログファイルを同時に監視する
tail -fはファイルを複数指定することで、同時に監視できます。# messagesとsecureを同時に監視する $ sudo tail -f /var/log/messages /var/log/secure ==> /var/log/messages <== Mar 30 10:20:01 server01 systemd: Started Session 146 of user root. ==> /var/log/secure <== Mar 30 10:20:05 server01 sshd[12500]: Failed password for invalid user test from 10.0.0.5 port 43210
==> ファイル名 <==というヘッダーが表示されるため、どのファイルのログかが一目で判別できます。3. tail -Fでログローテーション後も追跡を続ける
ログファイルは定期的にローテーション(logrotateによるファイル切り替え)が行われます。tail -fは元のファイル記述子(inode)を追跡するため、ローテーション後の新しいファイルを自動追跡しません。-Fオプション(大文字)を使うと、ファイル名を基準に追跡するため、ログローテーションが発生しても新しいファイルに自動で切り替わります。# ログローテーション後も追跡を続ける(-Fオプション) $ sudo tail -F /var/log/messages # -Fは --follow=name --retry と同じ意味 $ sudo tail --follow=name --retry /var/log/messages
-fではなく-Fを使うのが実務の鉄則です。4. lessの+Fモードでログを前後にスクロールする
tail -fはリアルタイム監視に特化していますが、「少し前のログに戻りたい」という場面では不便です。そんなときはless +Fを使ってください。# less +Fでリアルタイム監視を開始する $ sudo less +F /var/log/messages
・Ctrl+Cを押す:通常のlessモードに切り替わり、上下スクロールや検索(/キーワード)ができる
・Shift+Fを押す:再びリアルタイム監視モードに戻る
障害対応中に「あのエラーメッセージ、何行か前に見えた気がする」というとき、tail -fでは戻れませんが、less +Fなら一時停止して確認できます。
主要なログファイルの一覧と用途
tail -fで監視するにも、どのログファイルに何が記録されているかを知らなければ始まりません。主要なログファイルを把握しておきましょう。| ログファイル | 記録される内容 |
|---|---|
| /var/log/messages | システム全般の汎用ログ(カーネル、デーモン、サービスの起動停止など) |
| /var/log/secure | 認証関連(SSH、sudo、suなどのログイン・認証成功/失敗) |
| /var/log/cron | cronジョブの実行記録 |
| /var/log/maillog | メール送受信の記録(Postfix、Sendmailなど) |
| /var/log/httpd/access_log | Apache HTTP Serverのアクセスログ |
| /var/log/httpd/error_log | Apache HTTP Serverのエラーログ |
| /var/log/nginx/access.log | Nginxのアクセスログ |
| /var/log/boot.log | OS起動時のサービス起動ログ |
| /var/log/dmesg | カーネルメッセージ(ハードウェア認識、ドライバ読み込みなど) |
ディストリビューションによっては/var/log/messagesの代わりに/var/log/syslogが使われます(Ubuntu/Debianなど)。自分の環境のログ構成は
ls -la /var/log/で確認してください。「tail -fでログが流れない」時のトラブルシュート
1. ログファイルへの書き込みが止まっている
tail -fは「ファイルに追記があれば表示する」という仕組みのため、そもそもログが書き込まれていなければ何も表示されません。# rsyslogが動いているか確認する $ systemctl status rsyslog # rsyslogが停止していた場合は起動する $ sudo systemctl start rsyslog
2. ログローテーションでファイルが切り替わった
tail -f(小文字f)はinodeを追跡するため、logrotateでファイルが切り替わると、古いファイル(リネームされたファイル)を見続けてしまいます。# ファイルのinode番号を確認する $ ls -i /var/log/messages 12345678 /var/log/messages # ログローテーションが実行されたか確認する $ ls -la /var/log/messages* -rw------- 1 root root 1234 Mar 30 10:30 /var/log/messages -rw------- 1 root root 985432 Mar 30 04:02 /var/log/messages-20260330
tail -F(大文字F)を使うことです。長時間監視する場合は常に-Fを使う習慣をつけてください。3. パーミッション不足で読み取れない
ログファイルのパーミッションによっては、一般ユーザーでは読み取れない場合があります。# パーミッションを確認する $ ls -la /var/log/secure -rw------- 1 root root 54321 Mar 30 10:30 /var/log/secure # 一般ユーザーで実行するとPermission deniedになる $ tail -f /var/log/secure tail: cannot open '/var/log/secure' for reading: Permission denied # sudoを付けて実行する $ sudo tail -f /var/log/secure
sudoを付けて実行してください。4. journaldのみでファイル出力されていない
CentOS 7以降やRHEL 8以降では、systemd-journaldがログを管理しています。rsyslogが併用されていない環境では、/var/log/messagesにログが出力されないことがあります。# journaldでリアルタイムにログを確認する(tail -fの代替) $ sudo journalctl -f # 特定のサービスのログだけをリアルタイムで確認する $ sudo journalctl -u sshd -f # 優先度がerr以上のログだけをリアルタイムで確認する $ sudo journalctl -p err -f
journalctl -fはtail -f /var/log/messagesの代替として使えます。systemdを採用しているディストリビューションでは、journalctlも併せて覚えておくと対応の幅が広がります。本記事のまとめ
tail -fによるリアルタイムログ監視は、Linuxサーバー運用の基本中の基本です。ここで紹介した内容を一覧にまとめます。| やりたいこと | コマンド |
|---|---|
| ログをリアルタイムで監視する | sudo tail -f /var/log/messages |
| 末尾N行から監視を開始する | sudo tail -n 30 -f /var/log/messages |
| 特定キーワードだけ監視する | sudo tail -f /var/log/messages | grep -i "error" |
| 複数ファイルを同時に監視する | sudo tail -f /var/log/messages /var/log/secure |
| ログローテーション後も追跡する | sudo tail -F /var/log/messages |
| 前後スクロールしながら監視する | sudo less +F /var/log/messages |
| journaldでリアルタイム監視する | sudo journalctl -f |
| 特定サービスのログだけ監視する | sudo journalctl -u sshd -f |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
※登録30秒/合わなければ解除3秒
