【Linux】tailコマンドの使い方|リアルタイムでログを監視する方法

Linux

システム開発における試験などで、
実行したプログラムのログをリアルタイムで確認したいと感じる場面があると思います。

そのような場合に便利なのが、tailコマンドです。

筆者も試験中のログをリアルタイムで確認したいときに、
このtailコマンドをよく使っています。

かけりゅー
かけりゅー

tailコマンドの基本的な使い方をはじめ、
試験などシステム開発業務でよく使うオプションを本記事で紹介します。

tailコマンドとは

tailコマンドは、指定したファイルの最後の数行を表示するコマンドです。

一般的にログファイルは新しい内容が末尾へ追記されていくため、
tailコマンドを使うことで最新のログを効率よく確認できます。

基本構文は以下のとおりです。

tail [OPTION] [ファイル名]

指定したファイルの最後の行を表示します。
オプションの指定を省略した場合は、デフォルトで末尾10行が表示されます。

表示行数を指定する

表示する行数を任意に設定したい場合は、-n オプションを使用します。

$ tail -n 5 test.log
2024-06-01 10:00:01 INFO  Process started
2024-06-01 10:00:03 INFO  Loading config
2024-06-01 10:00:05 WARN  Config value missing, using default
2024-06-01 10:00:07 INFO  Connection established
2024-06-01 10:00:09 INFO  Ready to accept requests

指定した行数(この例では5行)だけがそのまま表示されます。

大量にあるログのうち、新しく書かれた部分のみを見たいときに使用します。

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

ログファイルへ追記される内容をリアルタイムで確認したい場合は、-f オプションを使用します。

プログラムを実行しながら、別のターミナルで tail -f を実行することで
想定どおり処理が実行されているかをリアルタイムで確認できます。

$ tail -f test.log
2024-06-01 09:59:55 INFO  Service initializing
2024-06-01 09:59:56 INFO  Reading environment variables
2024-06-01 09:59:57 INFO  Environment variables loaded
2024-06-01 09:59:58 INFO  Initializing database connection
2024-06-01 09:59:59 INFO  Database connection established
2024-06-01 10:00:01 INFO  Process started
2024-06-01 10:00:03 INFO  Loading config
2024-06-01 10:00:05 WARN  Config value missing, using default
2024-06-01 10:00:07 INFO  Connection established
2024-06-01 10:00:09 INFO  Ready to accept requests

この時点ではファイルの末尾10行が表示され、コマンドは終了せずに待機状態になります。
ここで別プロセスがログを追記すると、以下のように画面へ自動で追加表示されます。

2024-06-01 10:01:15 INFO  Request received: /api/status
2024-06-01 10:01:15 INFO  Response sent: 200 OK

新しい行が書き込まれるたびに、この形式で画面に追記され続けます。

監視を終了したいときは、Ctrl+C を押します。

ログローテートに対応したリアルタイム監視

ログローテートに対応したリアルタイム監視をしたい場合、-F オプションを使用します。

$ tail -F test.log

-f と -F の違いは、
監視対象を「ファイルディスクリプタ」で追う「ファイル名」で追うかという点です。

-f は、ファイルディスクリプタ(実体)を監視します。
ログローテートによって test.log が test.log.1 にリネームされ、
新しい test.log が作られても -f は元のファイル実体(=古い方)を見続けてしまいます。

一方で -F はファイル名を監視します。
test.log という名前のファイルが入れ替わったことを検知すると、
新しい test.log を自動的に開き直して監視を継続します。

この仕組みの違いから、ログがローテートされる環境でログを監視する場合は、
-F を使う必要があります。

監視対象がローテートしないとわかっている場合でも -F を使うことで困る場面はないため、
筆者は基本的に -f ではなく -F を最初から使うようにしています。

監視対象プロセスの終了と同時に監視を終了する

-f は Ctrl+C を押すまで監視を続けますが、
–pid オプションを併用すると、指定したプロセスIDが終了した時点で tail も自動的に終了します。

$ myprogram &
[1] 12345
$ tail -f --pid=12345 test.log
2024-06-01 10:00:09 INFO  Ready to accept requests
2024-06-01 10:01:15 INFO  Request received: /api/status
2024-06-01 10:01:15 INFO  Response sent: 200 OK
[1]+  Done                    myprogram
$

このように実行すると、
プロセスID 12345(myprogram)が終了したタイミングで tail の監視も自動的に終了します。

プログラムの実行が終わったあとに手動で Ctrl+C を押す手間がなくなるため、
プログラムの終了後、自動的に tail も終了させたい場合に便利です。

なお、–pid は -f または -F と併用した場合のみ有効で、単体では機能しません。
また、プロセス終了の検知には数秒程度のタイムラグが生じる場合があります。

まとめ

tailコマンドは、指定したファイルの最後の行を表示するコマンドですが、
ログをリアルタイムに監視したいときにも便利なコマンドです。

オプション内容
-n表示する行数を指定する
-fログをリアルタイムで監視する
-Fログローテートに対応したリアルタイム監視を行う
--pid指定したプロセスの終了と同時に監視を終了する

試験や動作確認でログを追いたい場面では、まず -F を基本として使い、
プロセスの終了に合わせて監視も終えたい場合は --pid を併用すると効率的です。

参考リンク

GNU Coreutils公式マニュアル:tailコマンド

コメント