はじめに
システム運用や開発をしていると、複数のログファイルをリアルタイムで監視したい場面がよくありますよね。tail -F は非常に便利ですが、複数のファイルを同時に追跡したり、ログローテーションによってファイル名が変わるような環境では、少し使い勝手が悪いと感じることもあるかもしれません。
XD.GROWTHでも様々なアプリケーションが稼働しており、
例えば順々にマルチプロセスで実行されていくバッチ群を同時に tail
して眺めたりすることなどは多々あります。
そこで、そのようなより柔軟なログ監視ツール「ftail」を Go 言語で作成しました。
本記事では ftail を紹介します。
tail -F
の機能を拡張し、複数のファイルを効率的に、かつ並列で監視することができます。
ftail とは?
ftail は、複数のログファイルを同時に監視・追跡するためのコマンドラインツールです。特に以下のような特徴があります。
-
グロブパターンをサポート:
/var/log/nginx/*.log
や/var/log/app/**/*.log
のようなおなじみのグロブ(glob)パターンを使用して、複数のファイルを一括で監視できます。 - ファイルの変化にリアルタイムで対応: 監視対象ディレクトリ内でのファイルの作成、削除、名前変更を即座に検知し、自動的に監視リストを更新します。
- シンボリックリンクを解決: シンボリックリンクを経由してアクセスされるファイルも正確に追跡し、重複して監視することを防ぎます。
- 軽量で高効率: ポーリングごとにファイルをオープン/クローズすることで、ファイルディスクリプタを大量に消費することなく、多数のファイルを監視できます。
このツールは、頻繁にログファイルがローテーションされたり、新しいログファイルが作成される環境で特に威力を発揮します。
使い方
1. ビルド方法
ftail を利用するには、まずソースコードをビルドする必要があります。Go がインストールされている環境で、以下のコマンドを実行するだけです。
git clone https://github.com/ebe-rest/ftail.git
cd ftail
go mod tidy
go build -ldflags="-s -w" -o ftail .
go build
に --ldflags="-s -w"
オプションを付けることで、シンボルテーブルとデバッグ情報を削除し、バイナリサイズを最適化できます。
2. 実行例
ビルドした ftail バイナリを、監視したいファイルにマッチするグロブパターンを引数として実行します。
# 複数のファイルを監視する例
./ftail "/var/log/nginx/*.log" "/var/log/apache2/*.access.log"
# サブディレクトリ内のログも再帰的に監視する例
./ftail "/var/log/app/**/*.log"
グロブパターンにマッチするファイルが新しく作成されると、ftail は自動的にそれを検知し、監視リストに追加します。
また、監視中にファイルが削除またはローテーションされた場合は追跡を停止します。
コマンドラインフラグ
ftail は、監視動作を細かく調整するためのいくつかのフラグを提供しています。
フラグ | デフォルト | 説明 |
---|---|---|
-poll-interval | 500ms | 監視中のファイルに新しいコンテンツがないかポーリングする間隔。 |
-scan-interval | 3s | グロブパターンにマッチする新しいファイルをスキャンする間隔。fsnotify のイベントが漏れた場合のフォールバックとして機能します。 |
-disp-interval | 1m | ファイルに変更がない場合に「変更なし」というメッセージを表示する間隔。 |
これらのフラグを使って、環境に最適な設定を見つけることができます。例えば、頻繁にログが更新される場合は -poll-interval
を短く設定すると良いでしょう。
期間に使用できる単位は小さい順に ナノ秒:ns
、マイクロ秒:us
(または "µs")、ミリ秒:ms
、秒:s
、分:m
、時:h
です。詳しくはこちらを参照してください。
開発者向け: 実装のポイント
ftail は、Go の強力な並行処理機能を活用して設計されています。
- doublestar ライブラリ: ftail は、Go 標準の path/filepath よりも柔軟なグロブパターンに対応するため、doublestar ライブラリを使用しています。
- 複数のゴールーチンによる処理:
- sync.Map でのファイル管理: 複数のゴールーチンから安全にアクセスできるように、監視中のファイルリストは sync.Map で管理されています。
まとめ
本記事では、tail \-F
の代替として利用できるGo製のログ監視ツール「ftail」を紹介しました。シンプルなコマンドラインインターフェースでありながら、複数のログファイルを効率的かつ柔軟に監視できるため、開発者やシステム管理者にとって非常に便利なツールです。
ぜひ一度試してみて、その便利さを実感してみてください!
使っていただいた感想や改善点なども頂けたら嬉しいです。