ホームページ  >  記事  >  バックエンド開発  >  Go で大きなログ ファイルの最後の 2 行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?

Go で大きなログ ファイルの最後の 2 行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-07 18:02:03552ブラウズ

How to Efficiently Read the Last Two Lines of a Large Log File in Go Every 10 Seconds?

Go で大きなログ ファイルから 10 秒ごとに最後の行を読み取る

大きなログ ファイルを扱う場合、効率的な方法を考案することが不可欠になりますメモリに過負荷をかけることなく、最新のデータを監視および分析できます。この記事では、Go を使用してログ ファイルの最後の 2 行を 10 秒ごとに読み取るアプローチについて説明することで、この課題に取り組みます。

まず、タイマー関数 (time.Tick) を利用します。 10 秒ごとにトリガーするように設定されています。この関数内では、readFile 関数が呼び出され、ログ ファイルから最新の行をリクエストします。

最後の行の読み取りの開始点を決定するために、(os) .File).Stat メソッドを使用してファイルのサイズを取得します。各行が約 32 バイトであると仮定して、開始位置を fileSize - 62* (最後の 2 行の場合) として計算します。

仮定に基づいた例を次に示します。

package main

import (
    "fmt"
    "os"
    "time"
)

const MYFILE = "logfile.log"

func main() {
    c := time.Tick(10 * time.Second)
    for now := range c {
        readFile(MYFILE)
    }
}

func readFile(fname string) {
    file, err := os.Open(fname)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    buf := make([]byte, 62)
    stat, statErr := file.Stat()
    if statErr != nil {
        panic(statErr)
    }
    start := stat.Size() - 62
    _, err = file.ReadAt(buf, start)
    if err == nil {
        fmt.Printf("%s\n", buf)
    }
}

このソリューションは、ログ ファイルをメモリに完全にロードすることなく、ログ ファイルの最後の 2 行を効率的に取得し、大きなログ ファイルをリアルタイムで効率的に監視できるようにします。

以上がGo で大きなログ ファイルの最後の 2 行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。