TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

Goで作る!リアルタイムログ監視CLIツール

Goで作る!リアルタイムログ監視CLIツール:fsnotifyとtailで学ぶファイル監視とログ解析

1. はじめに

システム運用やアプリケーション開発において、ログファイルの監視と解析は重要なタスクです。
特に、リアルタイムでログを監視し、特定のイベントやエラーを即座に検出することは、迅速な対応やトラブルシューティングに不可欠です。

本記事では、Go言語を用いて、リアルタイムでログファイルを監視し、特定のパターンを検出して通知するCLIツールの開発方法を解説します。
具体的には、fsnotifyライブラリを使用してファイルの変更を監視し、tailライブラリを用いてログファイルの末尾を追跡します。

2. 使用するライブラリとその役割

2.1 fsnotify

fsnotifyは、Go言語でファイルシステムの変更を監視するためのクロスプラットフォームなライブラリです。
ファイルやディレクトリの作成、変更、削除などのイベントを検出できます。

公式リポジトリ: fsnotify/fsnotify

2.2 tail

tailライブラリは、Unixtail -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で動作するリアルタイムログ監視ツールを簡単に作成できます。
本ツールは、運用自動化やログ監視の効率化に大いに役立つはずです。

8. 参考文献