tailコマンドでログ監視する方法|tail -fの使い方やgrep連携も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > tailコマンドでログ監視する方法|tail -fの使い方やgrep連携も
「tail -f でログを監視したいけど、画面が流れていくだけで必要な情報を見つけられない」
「tail コマンドでファイルの末尾を表示できるのは知っているけど、オプションの使い分けが曖昧」
Linuxサーバーの運用保守で、ログファイルをリアルタイムに監視する場面は毎日のように訪れます。

この記事では、Linuxの tail コマンドの基本的な使い方から、実務で最も重要な tail -f によるリアルタイム監視、grep との組み合わせによる特定ログの抽出、ログローテーションに対応する -F オプション(大文字)の使い分け、nohup を使ったバックグラウンド長時間監視、さらに journalctl -f との使い分けまでを解説します。RHEL 9 / AlmaLinux 9 / Ubuntu 24.04 LTS で動作確認済みです。

この記事のポイント

・tail -f はログをリアルタイム監視する運用保守の基本コマンド
・ログローテーションに対応するには -F(大文字)を使うのが鉄則
・grep や journalctl と組み合わせれば、必要な情報だけを絞り込める
・nohup で tail -F をバックグラウンド実行すれば、ターミナルを閉じても長時間監視が継続できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

tailコマンドとは?ファイル末尾を表示する基本コマンド

tail コマンドは、ファイルの末尾(最後の部分)を表示するコマンドです。対になるコマンドとして、ファイルの先頭を表示する head があります。

ログファイルは時系列で追記されていくため、最新の情報は必ずファイルの末尾に存在します。「直前に何が起きたか」を素早く確認したいときは、まず tail コマンドが最初の選択肢になります。

オプションを何も付けずに実行すると、デフォルトで末尾10行が表示されます。

# 基本書式 # tail [オプション] ファイル名 # /var/log/messages の末尾10行を表示する # tail /var/log/messages # 末尾30行を表示する # tail -n 30 /var/log/messages

1. 実際のサーバーでの実行例

本番サーバーで tail を実行すると、次のような出力が得られます。

# tail -n 5 /var/log/messages May 28 09:10:32 web01 kernel: EXT4-fs (sda1): mounted filesystem May 28 09:10:34 web01 systemd[1]: Started OpenSSH Server Daemon. May 28 09:10:35 web01 sshd[1234]: Server listening on 0.0.0.0 port 22. May 28 09:15:02 web01 sshd[2341]: Accepted publickey for ec2-user May 28 09:20:01 web01 CROND[3012]: (root) CMD (/usr/lib64/sa/sa1 1 1)

ログファイルの最新部分だけを素早く確認したい、というのが最も多い使い方です。

行数・バイト数を指定して表示する

1. 末尾の行数を指定する(-n)

デフォルトの10行では足りない、あるいは3行だけ見たいという場合は -n オプションで行数を指定します。

# 末尾20行を表示する # tail -n 20 /var/log/messages # -n を省略して数字だけでも指定できる # tail -20 /var/log/messages

また、-n +行番号 と「+(プラス)」を付けると、指定した行番号以降を全て表示できます。

# 50行目以降を全て表示する # tail -n +50 /var/log/messages # ヘッダー行(1行目)をスキップして2行目以降を表示する # tail -n +2 /tmp/access.csv

ヘッダー行を飛ばしてデータ部分だけを処理したい場合、またはスクリプトでログの増分処理をしたい場合に便利です。

2. 末尾のバイト数を指定する(-c)

行数ではなくバイト数で指定したい場合は -c オプションを使います。

# 末尾500バイトを表示する # tail -c 500 /var/log/messages # 末尾1KB(1024バイト)を表示する # tail -c 1024 /var/log/messages

バイナリ混じりのログや、固定長レコードのファイルを末尾から確認する場合に使います。

tail -f でリアルタイムにログを監視する(最重要)

tail コマンドで最も重要なオプションが -f(follow)です。ファイルの末尾を表示した後、コマンドが終了せずに待機し続け、新しい行が書き込まれるたびにリアルタイムで画面に表示します。

# /var/log/messages をリアルタイム監視する # tail -f /var/log/messages

実行すると末尾10行が表示され、そのまま画面が待機状態になります。他のプロセスがこのファイルに書き込みを行うと、即座に新しい行が画面に流れてきます。

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

実際の監視中の出力はこのようになります。プロンプトが戻らず画面が待機状態になっていれば、正常に監視中です。

# tail -f /var/log/messages May 28 09:30:01 web01 systemd[1]: Starting Session 42 of User ec2-user. May 28 09:30:01 web01 CROND[5201]: (root) CMD (/usr/lib64/sa/sa1 1 1) May 28 09:30:02 web01 systemd[1]: Started Session 42 of User ec2-user. May 28 09:35:01 web01 CROND[5302]: (root) CMD (/usr/lib64/sa/sa1 1 1) ← ここで待機中(新しい行が書き込まれると自動で表示される)

3. よく監視対象になるログファイル一覧

現場でよく tail -f の対象になるログファイルをまとめます。
ログファイル 用途
/var/log/messages システム全般のイベントログ(RHEL/CentOS 系)
/var/log/syslog システム全般のイベントログ(Ubuntu/Debian 系)
/var/log/secure SSH ログイン・認証ログ(RHEL/CentOS 系)
/var/log/auth.log SSH ログイン・認証ログ(Ubuntu/Debian 系)
/var/log/httpd/error_log Apache のエラーログ
/var/log/httpd/access_log Apache のアクセスログ
/var/log/nginx/error.log Nginx のエラーログ
/var/log/cron cron の実行ログ
/var/log/maillog メール送受信ログ(Postfix 等)

4. 行数を指定してから監視を開始する

-n-f を組み合わせると、「直近の指定行数を表示してからリアルタイム監視に入る」という動作になります。

# 直近50行を表示してから監視を開始する # tail -n 50 -f /var/log/messages # 直近0行(=過去の表示なし)で、新規追記分だけを監視する # tail -n 0 -f /var/log/messages

障害対応中に「今この瞬間から出るログだけを見たい」という場合は -n 0 -f を使うのが現場の定番です。

5. 複数ファイルを同時に監視する

tail -f にはファイルを複数指定できます。どのファイルに書き込まれたかがヘッダー付きで表示されるため、関連する複数のログを同時に追いかけるのに便利です。

# messages と secure を同時に監視する # tail -f /var/log/messages /var/log/secure ==> /var/log/messages <== Mar 10 10:00:01 server systemd: Started Session 123. ==> /var/log/secure <== Mar 10 10:00:05 server sshd[1234]: Accepted publickey for admin

tail -f と grep を組み合わせてログを絞り込む

tail -f だけでは全てのログが画面に流れてくるため、本番環境のようにログ量が多いサーバーでは肝心の情報が埋もれてしまいます。

パイプで grep に渡すことで、特定のキーワードを含む行だけをリアルタイムに抽出できます。

# ERROR を含む行だけをリアルタイム監視する # tail -f /var/log/messages | grep "ERROR" # 大文字・小文字を区別せずに error を抽出する # tail -f /var/log/messages | grep -i "error" # 特定のIPアドレスからのアクセスだけを監視する # tail -f /var/log/httpd/access_log | grep "192.168.1.100" # 特定のキーワードを除外して監視する(CRONのログは邪魔なので除外) # tail -f /var/log/messages | grep -v "CRON"

この tail -f | grep のパイプ連携は、サーバー管理者が最も頻繁に使うコマンドの組み合わせの1つです。障害対応中にターミナルを開いて、まずこれを叩くのが現場のセオリーです。

【重要】grep に --line-buffered を付ける

tail -f | grep の組み合わせで「ログは出ているはずなのに grep の結果が画面に表示されない」という症状が起きることがあります。これは grep が出力をバッファリング(一定量溜めてから一括出力)しているのが原因です。

--line-buffered オプションを付けると、1行ごとに即座に出力されるようになります。

# --line-buffered で1行ずつ即時表示する # tail -f /var/log/messages | grep --line-buffered "ERROR"

リアルタイム監視で grep を使う場合は、常に --line-buffered を付ける癖をつけておくのが安全です。

tail -F でログローテーションに対応する

本番サーバーでは logrotate(ログローテーション)によって、ログファイルが定期的に切り替わります。例えば /var/log/messages/var/log/messages-20260310 にリネームされ、新しい /var/log/messages が作成される、という動作です。

tail -f はファイルディスクリプタ(ファイルの内部的な識別情報)を追いかけるため、ログローテーションでファイルが切り替わると、古いファイルを監視し続けてしまいます。新しいファイルへの書き込みは表示されません。

-F オプション(大文字のF)はファイル名を追いかけるため、ファイルが入れ替わっても自動的に新しいファイルの監視を再開します。

# ログローテーションに追従して監視する(本番環境向け) # tail -F /var/log/messages # --follow=name と --retry を組み合わせた確実な追跡 # tail --follow=name --retry /var/log/messages

-F--follow=name --retry と同等の動作です。ファイルが一時的に存在しなくなってもリトライしてくれます。

-f(小文字)と -F(大文字)の違いを表にまとめます。
オプション 追跡方式 logrotate 後の動作
-f(小文字) ファイルディスクリプタで追跡 古いファイルを追い続ける(監視が止まる)
-F(大文字) ファイル名で追跡(定期的に再オープン) 新しいファイルを自動で追い直す
--follow=name -F と同等(ファイル名で追跡) 新しいファイルを自動で追い直す
--retry ファイルが存在しないときも待機 ファイルが消えても再作成を待つ
本番環境で長時間のログ監視を行う場合は、-f ではなく -F を使うのが鉄則です。

実際に -F がどう動くかを確認します。logrotate が実行されると次のメッセージが表示され、自動で新しいファイルへ切り替わります。

# tail -F /var/log/messages May 28 10:00:01 web01 CROND[6100]: (root) CMD (...) (logrotate が実行) tail: '/var/log/messages' has been replaced; following new file May 28 10:00:05 web01 rsyslog[850]: imuxsock: Acquired UNIX socket... (新しいファイルの監視を自動で再開)

「has been replaced; following new file」というメッセージが表示され、自動で新しいファイルへ切り替わっていることがわかります。

headコマンドとの使い分け

tail がファイルの末尾を表示するのに対し、head はファイルの先頭を表示します。

tail:ログファイルの最新部分を確認する(末尾が最新)
head:設定ファイルの冒頭コメントやヘッダー行を確認する

# ファイルの先頭10行を表示する # head /etc/httpd/conf/httpd.conf # ファイルの先頭20行を表示する # head -n 20 /etc/httpd/conf/httpd.conf

6. パイプと組み合わせる

他のコマンドの出力結果をパイプで受け取り、末尾だけ(または先頭だけ)を表示するのも日常的な使い方です。

# プロセス一覧からCPU使用率の高い上位5つを表示する # ps aux --sort=-%cpu | head -6 # 最近更新されたファイル5つを表示する # ls -lt /var/log/ | head -6 # ディスク使用量の大きいディレクトリ上位10件を表示する # du -sh /var/* | sort -rh | head -10 # 長い出力の末尾5行だけを表示する # dmesg | tail -5

journalctl -f との比較(systemd環境)

RHEL 7 / CentOS 7 以降のsystemd環境では、多くのサービスのログが /var/log/messages などのテキストファイルではなく、systemdのジャーナル(バイナリ形式)に記録されます。

この場合、tail -f の代わりに journalctl -f を使います。

# システム全体のログをリアルタイム監視する # journalctl -f # 特定のサービス(例:httpd)のログだけを監視する # journalctl -u httpd -f # 特定の優先度(エラー以上)のログだけを監視する # journalctl -f -p err

tailjournalctl の使い分けをまとめます。
状況 使うコマンド
/var/log/ 配下のテキストログを監視 tail -F ファイルパス
systemd ユニット(sshd・httpd 等)のログ journalctl -u sshd -f
カーネルメッセージをリアルタイム監視 dmesg -w または journalctl -k -f
全 systemd ログをリアルタイム監視 journalctl -f
実際の運用では、Apacheやnginxのアクセスログのようにテキストファイルとして出力されるログは tail -f で、systemctlで管理しているサービスの動作ログは journalctl -f で監視する、という使い分けになります。

実務で使えるtailの応用パターン

7. 複数キーワードで絞り込む

grep -E(拡張正規表現)を使うと、複数のキーワードのいずれかにマッチする行を抽出できます。

# ERROR または WARNING を含む行だけを監視する # tail -f /var/log/messages | grep --line-buffered -E "ERROR|WARNING" # 特定のキーワードを除外して監視する # tail -f /var/log/messages | grep --line-buffered -v "CRON"

8. タイムスタンプ付きで監視結果をファイルに保存する

障害対応中、後からログを振り返るために監視結果をファイルに残しておきたい場合は tee を使います。

# 画面に表示しつつ、ファイルにも保存する # tail -f /var/log/messages | tee /tmp/monitor.log # grep で絞り込んだ結果だけを保存する # tail -f /var/log/messages | grep --line-buffered "ERROR" | tee /tmp/error_monitor.log

9. エラー検知でアラートを出すスクリプト

tail -F をスクリプトに組み込むことで、特定のログパターンを検知したタイミングでアクションを実行できます。障害対応の初動を自動化したい場合に活用してください。

#!/bin/bash # エラー行を検知したらターミナルにアラートを出す # 使い方: bash watch-error.sh /var/log/httpd/error_log LOG_FILE="${1:-/var/log/messages}" PATTERN="error|critical|fatal" echo "[監視開始] ${LOG_FILE}" tail -F "${LOG_FILE}" | while read -r line; do if echo "${line}" | grep -qiE "${PATTERN}"; then echo "[ALERT] $(date '+%Y-%m-%d %H:%M:%S') ${line}" fi done

10. バックグラウンドでの長時間監視(nohup)

通常の tail -f はターミナルを閉じると停止します。長時間の監視をバックグラウンドで続けたい場合は nohup を使います。

# バックグラウンドで tail -F を実行しログファイルへ書き出す # nohup tail -F /var/log/httpd/error_log > /tmp/tail-output.log 2>&1 & # echo $! > /tmp/tail-watch.pid # 後から確認する # tail -f /tmp/tail-output.log # 監視を停止する # kill $(cat /tmp/tail-watch.pid)

screentmux でセッションを維持する方法もありますが、単純なバックグラウンド監視であれば nohup が手軽です。

tail -f が表示されない場合のトラブルシュート

【トラブル1】Permission denied でログが読めない

# tail -f /var/log/secure tail: cannot open '/var/log/secure' for reading: Permission denied

root または adm グループへの昇格が必要です。

# root で実行する # sudo tail -f /var/log/secure # 一般ユーザーを adm グループに追加する(RHEL/CentOS 系) # sudo usermod -aG adm ec2-user

「tail -f でログを監視しているのに何も表示されない」場合

以下の原因を順番に確認してください。

そもそもログが出力されていない:監視対象のサービスが停止していないか、systemctl status サービス名 で確認する
ログの出力先が違う:サービスによってはデフォルトのログ出力先が /var/log/messages ではない場合がある。サービスの設定ファイルで実際の出力先を確認する
journalに出力されている:systemd管理のサービスはテキストファイルではなくジャーナルに出力されている可能性がある。journalctl -u サービス名 -f を試す

「tail -f | grep で結果が遅れて表示される」場合

前述の通り、grep のバッファリングが原因です。--line-buffered オプションを付けてください。

# バッファリングを無効化して即時表示する # tail -f /var/log/messages | grep --line-buffered "ERROR"

「tail -f でログローテーション後に表示が止まった」場合

-f(小文字)はファイルディスクリプタを追いかけるため、ログローテーションでファイルが切り替わると新しいファイルを認識できません。-F(大文字)に変更してください。

# ログローテーション対応版 # tail -F /var/log/messages

本記事のまとめ

やりたいこと コマンド
ファイルの末尾10行を表示する tail ファイル名
末尾の行数を指定して表示する tail -n 20 ファイル名
末尾のバイト数を指定して表示する tail -c 500 ファイル名
N行目から末尾まで全て表示する tail -n +50 ファイル名
リアルタイムにログを監視する(基本) tail -f ファイル名
特定のキーワードだけリアルタイム監視する tail -f ファイル名 | grep --line-buffered "キーワード"
複数ファイルを同時に監視する tail -f ファイル1 ファイル2
ログローテーションに追従して監視する(推奨) tail -F ファイル名
ファイルが消えても待機して追跡する tail --follow=name --retry ファイル名
バックグラウンドで長時間監視する nohup tail -F ファイル名 > 出力ファイル &
systemdサービスのログを監視する journalctl -u サービス名 -f
ファイルの先頭を表示する head ファイル名

ログ監視を自信を持ってこなせるようになりたい方へ

tail -f の使い分けは、障害対応の現場で必ず問われる基本技術です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。