[golang]使用tail追踪文件变更
阅读原文时间:2023年10月19日阅读:12

借助 github.com/hpcloud/tail ,可以实时追踪文件变更,达到类似shell命令tail -f的效果。

以下示例代码用于实时读取nginx的access.log日志文件,读取到后输出到控制台。如果nginx日志做了json格式化,还可以解析读取到的内容,对日志进行更多处理,比如日志内容写入数据库、做日志告警等,对于访问量较小的系统来说,这样就不需要消耗很多资源去搭建ELK、Loki等专门的日志监控系统。

package main

import (
    "flag"
    "fmt"
    "io"
    "os"

    "github.com/hpcloud/tail"
)

var (
    logfile = flag.String("f", "access.log", "日志文件路径")
)

func main() {
    flag.Parse()
    // 判断文件是否存在
    if _, err := os.Stat(*logfile); os.IsNotExist(err) {
        fmt.Printf("Error! %s not found\n", *logfile)
        os.Exit(1)
    }

    // 不从文件开始读, 而是从文件当前末尾开始读
    // Go 1.20推荐使用 io.SeekEnd, 老版本可能需要改为os.SEEK_END
    seek := &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}
    t, err := tail.TailFile(*logfile, tail.Config{
        Follow:   true,
        Location: seek,
    })
    if err != nil {
        fmt.Println(err)
    }

    for line := range t.Lines {
        fmt.Println(line.Text)
    }
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器