Linux / コマンド / tail - ファイルの最後の内容とログのリアルタイム確認

tailはファイルの末尾部分を確認するLinuxコマンドです。オプションなしで実行すると最後の10行を出力し、-nで行数を指定し、-fまたは-Fで新たに追加されるログを継続的に確認することができます。

障害直前のログを素早く確認したり、実行中のサービスのログを観察する際に特に便利です。この記事では、基本的な文法からログローテーションを考慮した追跡方法、フィルタリングや複数ファイルのモニタリングまで、実際の例を用いて説明します。

tailコマンドとは?

tailはテキスト入力の最後の部分を出力します。ファイルを指定しない場合やファイルの代わりに-を使用すると、標準入力を読み込みます。基本の出力単位は行で、特別なオプションがなければ最後の10行を表示します。

ファイル全体を開かずに末尾だけを確認できるため、大きなログファイルを点検する際に便利です。ただし、tailはログを分析したり保存するツールではなく、ファイルの末尾を読み、その変化を追跡するためのツールです。

基本的な文法と使い方

基本文法は次の通りです。角かっこは省略できる引数を示すため、実際のコマンドには入力しません。

tail [オプション] [ファイル...]

例えば /var/log/app.log の最後の10行を確認するには、次のように実行します。

tail /var/log/app.log

最後の20行が必要な場合は、-n オプションに行数を指定します。

tail -n 20 /var/log/app.log

-20 のように短く書くこともできますが、スクリプトや文書では意味が明確な -n 20 形式の方が読みやすいです。

希望する範囲だけを出力する方法

最後のN行を出力する

-n N はファイルの末尾から N 行を出力します。最近のリクエストやエラーを一定の範囲で確認する場合に使用します。

tail -n 50 access.log

出力を1画面ずつ読みたい場合は、less と接続できます。

tail -n 500 access.log | less

N 番目の行から最後まで出力する

数字の前にプラス記号を付けた -n +N は意味が異なります。最後の N 行ではなく、ファイルの N 行目から最後までを出力します。

tail -n +2 data.csv

この例では、CSV ファイルの最初の行であるヘッダーを除き、2 行目から出力します。パイプラインで最初の行をスキップする際に簡単に利用できます。

行ではなくバイト単位で出力する

-c N は行ではなく、最後の N バイトを出力します。K、M のような接尾辞を使用できます。

tail -c 1K output.bin

-c +N は N バイト目から最後まで出力します。バイト単位で切るとマルチバイト文字が途中で切れることがあるため、日本語などのマルチバイト文字を含むテキストでは通常 -n の方が安全です。

新しく追加されるログを見続ける

-f で開いたファイルを追跡し続ける

-f はまずファイルの末尾を出力し、その後ファイルに内容が追加されるたびに続けて表示します。基本的な動作は開いたファイルディスクリプタを追跡するため、同じファイルにログが継続して追加される状況に適しています。

tail -f /var/log/app.log

Ctrl+Cを押すと追跡を終了します。

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

運用環境のログファイルは、一定のサイズや時間が経過すると名前が変更され、新しいファイルに置き換わることがあります。これをログローテーション(log rotation)と呼びます。GNU tailの-Fは--follow=name --retryと同様に、ファイル名を基準に再度開くことを試みます。

tail -F /var/log/app.log

したがって、ローテーションされる一般的なサービスログを長時間観察する場合、-fよりも-Fのほうが実用的な場合が多いです。この動作はGNU Coreutilsのtail公式ドキュメントで確認できます。

既存内容なしで新しいログのみを見る

-fを実行する際、既存の最後の10行が不要であれば-n 0を併用します。コマンド実行後に追加される行のみが表示されます。

tail -n 0 -f /var/log/app.log

よく使うオプション

オプション 機能 活用例
-n N 最後のN行を出力 tail -n 100 app.log
-n +N N番目の行から出力 tail -n +2 data.csv
-c N 最後のNバイトを出力 tail -c 2K data.bin
-f 開かれたファイルの追加内容を追跡 継続的に書き込まれる単一ファイルを観察
-F ファイル名に基づく追跡および再試行 ローテーションされるログを観察
-s N ポーリング(定期確認)の間隔をN秒に指定。inotify使用時の追加表示間隔を制限するものではありません tail -f -s 2 app.log
--pid=PID 指定プロセス終了後に追跡終了 バッチ作業ログと共に使用
-q ファイル名ヘッダーを非表示 複数ファイル出力を一つのように処理
-v 常にファイル名ヘッダーを表示 元ファイルを明確に区別

オプションの詳細なサポート範囲は、OSと tail の実装により異なる場合があります。特に -F と --pid をスクリプトで使用する場合は、対象システムで tail --help によるサポート有無を確認することを推奨します。

ログ確認に役立つ実践例

最近のエラーだけを探す

まず最近の200行だけを読み、その後grepでエラー文字列をフィルターすれば、古い大規模なログ全体を検索する作業を減らすことができます。

tail -n 200 app.log | grep 'ERROR'

大文字と小文字を区別したくない場合はgrep -i、行番号が必要な場合はgrep -nを使用できます。

追加されるエラーだけを見続ける

ローテーションされるログを追いながらエラー行だけを見たい場合は、次のように接続します。GNU grepの--line-bufferedは各行をすぐに渡すため、パイプでの出力遅延を減らすのに役立ちます。

tail -F app.log | grep --line-buffered 'ERROR'

この方式は画面に表示される内容を絞るだけで、元のログを変更することはありません。複数の条件や構造化されたログ分析が必要な場合は、専用のログ収集・検索ツールを検討するのが良いでしょう。

複数のログファイルを同時に見る

tailには複数のファイルを指定することができます。このとき、どのファイルの出力か分かるようにファイル名のヘッダーが表示されます。

tail -F access.log error.log

ファイルごとの出力をさらに明確に区別するには-vを追加し、ヘッダーが不要な場合は-qを使用します。

プロセスが終わると追跡も終了する

GNU tailでは、--pidを使用して特定のプロセスが終了した後にファイル追跡を終了することができます。some_commandは実行したい処理に置き換える仮の名前で、そのままでは動きません。実行前にbuild.logを上書きしてよいかも確認してください。次の例の$!は、シェルで最近バックグラウンドで実行されたプロセスのIDです。

some_command > build.log 2>&1 &
tail --pid=$! -f build.log

--pidの確認は-fと共に動作し、終了検知がすぐに行われるとは限りません。自動化では、コマンドの終了コードとログファイルも別途確認する必要があります。

-fと-Fの違い

区分 -f -F
追跡基準 基本的に開かれているファイルディスクリプター 指定したファイル名
ファイルの置き換え 既存の開いているファイルを引き続き見ることができる 同じ名前で新しく作られたファイルを再び開く
ファイル一時欠如 開いたファイルを保持して追跡し、同名で再作成された別ファイルには切り替えない --retry 動作で再び生成されるのを待つ
推奨状況 置き換えられないファイルの短期観察 ローテーションされるサービスログの長期観察

常に-Fが最良というわけではありません。名前が変わった既存のファイルにプロセスが引き続き書き込む特殊な状況では、開かれたファイルを保持する-fが必要な内容をよりよく示すことがあります。ログ作成方式とローテーションポリシーに基づいて選択する必要があります。

tailが適さない場合

  • systemd ジャーナル: ログが通常のテキストファイルではなくジャーナルに保存されている場合、journalctl -fを使用します。特定のサービスはjournalctl -f -u サービス名に絞ることができます。
  • 先頭部分の確認: ファイルの最初の数行はheadがより直接的です。
  • 移動しながら読む: 過去の内容と新しい内容を行き来して確認する場合、less +F ファイル名が便利なことがあります。Ctrl+Cで追跡を止めた後、上下に移動し、Fで再度追跡します。
  • コマンド結果の定期更新: ファイルの追加分ではなく、コマンドの最新結果を繰り返し確認したい場合は、Linux watch コマンドの使い方の方が目的により適しています。
  • 大規模な中央ログ: 複数のサーバーのログを長期間検索・集計・アラート処理する必要がある場合は、中央ログシステムやオブザーバビリティツールが必要です。

権限と運用環境での注意点

Permission denied エラー

ログファイルの読み取り権限がない場合、Permission denied エラーが発生します。まず ls -l ファイル名 で所有者と権限を確認し、必要な権限を管理者に依頼するのが安全です。無条件に権限を広げたり、すべてのコマンドの前に sudo を付ける方法は避けるべきです。

機密性の高いログ出力

認証トークン、セッションID、個人情報がログに含まれる可能性があります。画面共有、ターミナル記録、コピーしたエラーメッセージに機密情報が露出していないか確認する必要があります。運用ログを外部に渡す場合は、必要な範囲だけ抽出し、機密情報を隠す必要があります。

よくある質問

tailは基本的に何行を出力しますか?

オプションを指定しないと、最後の10行が表示されます。行数を変える場合は、tail -n 30 ファイル名のように-nの後に希望する行数を指定します。

tail -fをどう終了しますか?

Ctrl+Cを押すと、実行中の追跡が中止され、シェルプロンプトに戻ります。この動作はログファイルを削除したり変更したりしません。

ログローテーション後に新しい内容が表示されないのはなぜですか?

-fが交換前のファイルのディスクリプタを引き続き追跡している可能性があります。ファイル名を基準に新しいファイルを再度開くGNU tail -F ファイル名を試してください。それでも見えない場合は、実際のログパスとサービスの出力設定を確認する必要があります。

圧縮されたログファイルにもtailを使用できますか?

tailは圧縮形式を自動的に解凍しません。圧縮ファイル全体を解凍してパイプで渡すことはできますが、大きなファイルでは非効率的です。例えばgzipファイルはzcat archive.log.gz | tail -n 50のように確認できます。

まとめ

最近の内容を素早く確認するにはtail ファイル名、希望する行数を指定するにはtail -n N ファイル名を使用します。新しいログを継続的に確認したい場合は-f、ログローテーションでファイルが置き換えられる環境ではGNU tailの-Fを優先して確認してください。

grepと接続すれば必要なメッセージだけをフィルタリングできますが、権限や機密情報の漏洩には注意が必要です。その他の基本ツールも併せて習得したい場合はLinuxでよく使われるコマンド一覧を参考にできます。