tail --max-unchanged-statsオプションを徹底解説!初心者でもわかるローテート監視の基本
生徒
「Linuxのtailコマンドって、ログファイルの最後の行を見られるんですよね?」
先生
「そうですね。特にtail -fとすると、ログファイルの更新をリアルタイムで監視できますよ。」
生徒
「でもログがローテートされたら、tailはどうなるんですか?」
先生
「良い質問です。実はそのときに便利なのが--max-unchanged-statsオプションなんです!」
1. tailコマンドとは?
tailコマンドは、ファイルの最後の数行を表示するLinuxコマンドです。特にログファイルなどのリアルタイム監視に使われることが多く、tail -fのようにオプションを組み合わせて使用します。
-fは「ファイルの更新を監視し続ける」という意味で、たとえばApacheのアクセスログなどをリアルタイムに確認したいときにとても便利です。
2. ログファイルのローテートとは?
ログのローテートとは、ファイルが大きくなりすぎるのを防ぐために、新しいログファイルに切り替える作業のことです。たとえば、/var/log/access.logというファイルが定期的にaccess.log.1などに名前を変えて、新しいaccess.logが作られる仕組みです。
このとき、tail -fで元のファイルを監視していた場合、新しいファイルに切り替わったことに気づかず、更新されなくなってしまう場合があります。
3. --max-unchanged-statsオプションとは?
--max-unchanged-statsオプションは、ファイルの「統計情報(stat)」が変わらなかった場合に、tailが「ログが切り替わったかも」と判断するまでの回数を指定します。
たとえば、次のように使います:
tail -F --max-unchanged-stats=5 /var/log/syslog
この例では、/var/log/syslogの「inode」や「サイズ」などの統計情報が5回連続で変わらなかったら、「もしかしてファイルがローテートされたかも?」と判断して、新しいファイルに切り替えてくれます。
4. -fと-Fの違いも知っておこう
tail -fはファイルの更新を監視しますが、ファイルがローテートされたときには新しいファイルを自動的に追跡してくれません。
それに対してtail -Fは、ローテートも考慮して新しいファイルを探してくれます。実は-Fは--follow=name --retryの省略形であり、ローテート対応版の-fと考えると分かりやすいです。
5. ローテート監視の具体的な例
以下のように--max-unchanged-statsを指定すると、ファイルの中身に変化がないことを何度か確認したあとで、ファイルがローテートされたとみなすことができます。
tail -F --max-unchanged-stats=3 /var/log/nginx/access.log
このように設定しておけば、ファイルのローテートに柔軟に対応しつつ、更新がないからといって即座にファイルを切り替えるわけではないので、誤判定も減らせます。
6. オプションの組み合わせ例
tailコマンドでは複数のオプションを同時に使えます。以下に、よく使う組み合わせ例を紹介します。
行数指定+ローテート監視
tail -n 20 -F --max-unchanged-stats=4 /var/log/messages
この例では、messagesファイルの最後の20行を表示しつつ、ファイルがローテートされたかどうかも監視しています。
複数ファイルを同時に監視
tail -F --max-unchanged-stats=6 /var/log/cron /var/log/auth.log
複数のログファイルを同時にローテート対応で監視することも可能です。
7. 他のtail系コマンドとの違い
他にもログ監視ツールとしてmultitailやless +Fなどもありますが、tail -F+--max-unchanged-statsは標準コマンドであり、余計なインストールが不要という点が魅力です。
cronやnginx、Apacheなどのログを扱う場面では、まずこのコマンドで様子を見るのが王道です。
8. --max-unchanged-statsの設定値はどう決める?
この値を小さくすると早くファイルの変化を検出しますが、通常の一時停止とローテートの違いを誤認するリスクもあります。
一方、値を大きくすれば慎重に判定されますが、新しいファイルへの切り替えに少し時間がかかることになります。
実運用では3〜6の範囲で様子を見るのが無難です。サーバのログ更新頻度に合わせて最適な値を設定しましょう。