Goで作る!リアルタイムログ監視CLIツール:fsnotifyとtailで学ぶファイル監視とログ解析
1. はじめに
システム運用やアプリケーション開発において、ログファイルの監視と解析は重要なタスクです。
特に、リアルタイムでログを監視し、特定のイベントやエラーを即座に検出することは、迅速な対応やトラブルシューティングに不可欠です。
本記事では、Go言語を用いて、リアルタイムでログファイルを監視し、特定のパターンを検出して通知するCLIツールの開発方法を解説します。
具体的には、fsnotify
ライブラリを使用してファイルの変更を監視し、tail
ライブラリを用いてログファイルの末尾を追跡します。
2. 使用するライブラリとその役割
2.1 fsnotify
fsnotify
は、Go言語でファイルシステムの変更を監視するためのクロスプラットフォームなライブラリです。
ファイルやディレクトリの作成、変更、削除などのイベントを検出できます。
2.2 tail
tail
ライブラリは、Unixのtail -f
コマンドのように、ファイルの末尾を追跡する機能を提供します。
ログファイルが更新されるたびに、新しい行を読み取ることができます。
ライブラリ: nxadm/tail
3. 開発環境の構築
3.1 Goのインストール
Goの公式サイトから、最新のGoをインストールしてください。
公式サイト: https://golang.org/dl/
3.2 プロジェクトのセットアップ
ターミナルで以下のコマンドを実行して、新しいGoプロジェクトを作成します。
mkdir logwatcher cd logwatcher go mod init logwatcher
3.3 必要なライブラリのインストール
go get github.com/fsnotify/fsnotify go get github.com/nxadm/tail
4. ログ監視ツールの実装
4.1 main.goの作成
以下のコードをmain.go
ファイルに記述します。
package main import ( "fmt" "log" "regexp" "github.com/fsnotify/fsnotify" "github.com/nxadm/tail" ) func main() { logFile := "example.log" // 監視対象ログファイル watcher, err := fsnotify.NewWatcher() if err != nil { log.Fatal(err) } defer watcher.Close() err = watcher.Add(".") if err != nil { log.Fatal(err) } t, err := tail.TailFile(logFile, tail.Config{Follow: true, ReOpen: true}) if err != nil { log.Fatal(err) } errorPattern := regexp.MustCompile(`ERROR`) go func() { for line := range t.Lines { if errorPattern.MatchString(line.Text) { fmt.Println("エラー検出:", line.Text) } } }() for { select { case event := <-watcher.Events: fmt.Println("イベント検出:", event) case err := <-watcher.Errors: fmt.Println("監視エラー:", err) } } }
5. 実行と動作確認
5.1 ツールの実行
go run main.go
5.2 ログファイルに追記
別のターミナルで、以下を実行します。
echo "INFO: 正常に動作しています。" >> example.log echo "ERROR: エラーが発生しました。" >> example.log
ERROR
を含む行が検出されると、以下のような出力が得られます:
エラー検出: ERROR: エラーが発生しました。
6. 応用と拡張
- Slackやメールへの通知機能
INFO
/WARN
/ERROR
レベルの分類- 一定期間の集計やレポート出力
- 複数ファイル同時監視
7. まとめ
Goとfsnotify、tailライブラリを使えば、CLIで動作するリアルタイムログ監視ツールを簡単に作成できます。
本ツールは、運用自動化やログ監視の効率化に大いに役立つはずです。