Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > golang tail

golang使用tail实现追踪文件变更

作者:花酒锄作田

这篇文章主要为大家介绍了golang如何借助 github.com/hpcloud/tail ,实现实时追踪文件变更,达到类似shell命令tail -f的效果,感兴趣的小伙伴可以了解一下

简介

借助 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)
	}
}

知识补充

1.官方文档

2.github.com/hpcloud/tail 使用介绍

地址:https://github.com/hpcloud/tail

linux中的tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容。

这个包实现了类似的功能。

t, err := tail.TailFile("/var/log/nginx.log", tail.Config{Follow: true})
if err != nil {
    fmt.Println(err)  //如果文件不存在,会阻塞并打印Waiting for my.log to appear...,直到文件被创建
}
for line := range t.Lines {
    fmt.Println(line.Text)
}

tail.TailFile()函数开启goroutine去读取文件,通过channel格式的t.lines传递内容。

其他配置项

type Config struct {
    // File-specifc
    Location    *SeekInfo // 指定开始读取的位置
    ReOpen      bool      //true则文件被删掉阻塞等待新建该文件,false则文件被删掉时程序结束
    MustExist   bool      //true则没有找到文件就报错并结束,false则没有找到文件就阻塞保持住
    Poll        bool      // 使用Linux的Poll函数,poll的作用是把当前的文件指针挂到等待队列
    Pipe        bool      // Is a named pipe (mkfifo)
    RateLimiter *ratelimiter.LeakyBucket
    // Generic IO
    Follow      bool //true则一直阻塞并监听指定文件,false则一次读完就结束程序
    MaxLineSize int  // If non-zero, split longer lines into multiple lines
    // Logger, when nil, is set to tail.DefaultLogger
    // To disable logging: set field to tail.DiscardingLogger
    Logger logger
}

location类似os.seek,举例 

seek := &tail.SeekInfo{Offset:5,Whence:os.SEEK_CUR}
t, err := tail.TailFile("my.log", tail.Config{Location:seek})
offset //Whence之后,再偏移n个字符开始读,偏移量大于一行内容时换行继续计算(换行符\n计算在内占两个字符,但是不打印出来)
SEEK_SET int = 0 // 跳到文件的开始位置
SEEK_CUR int = 1 // 跳到文件的当前位置(好像和设置为开始位置一样)
SEEK_END int = 2 // 跳到文件最后,不读取文件里原有的内容,从新加入的开始读

t.Tell()返回当前offset

到此这篇关于golang使用tail实现追踪文件变更的文章就介绍到这了,更多相关golang tail内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文