0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数のログファイルを効率的に監視するGo製ツール「ftail」

Last updated at Posted at 2025-08-20

はじめに

システム運用や開発をしていると、複数のログファイルをリアルタイムで監視したい場面がよくありますよね。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 ライブラリを使用しています。
  • 複数のゴールーチンによる処理:
    1. handleDirEventsメソッド: inotify 等のラッパーモジュールである fsnotify のイベントを処理し、監視対象の追加・削除を行います。
    2. pollFilesメソッド: 各ファイルを定期的にポーリングし、新しいコンテンツを読み取って標準出力に書き出します。
    3. scanForNewFilesメソッド: 定期的にグロブパターンにマッチするファイルを再スキャンし、ftail が見逃した変更を検出します。
  • sync.Map でのファイル管理: 複数のゴールーチンから安全にアクセスできるように、監視中のファイルリストは sync.Map で管理されています。

まとめ

本記事では、tail \-F の代替として利用できるGo製のログ監視ツール「ftail」を紹介しました。シンプルなコマンドラインインターフェースでありながら、複数のログファイルを効率的かつ柔軟に監視できるため、開発者やシステム管理者にとって非常に便利なツールです。

ぜひ一度試してみて、その便利さを実感してみてください!

使っていただいた感想や改善点なども頂けたら嬉しいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?