go读取日志tailf
go读取日志tailf
tailf
Go语言中读取日志使用第三方库:github.com/hpcloud/tail。
下载及安装
go get github.com/hpcloud/tail
Tail结构体
type Tail struct {
Filename string
Lines chan *Line
Config
tomb.Tomb // provides: Done, Kill, Dying
// contains filtered or unexported fields
}
func TailFile函数
func TailFile(filename string, config Config) (*Tail, error)
TailFile begins 传入参数:日志文件的路径和配置文件,返回一个指向Tail结构体对象的指针。
Config结构体
type Config struct {
// File-specifc
Location *SeekInfo // Seek to this location before tailing
ReOpen bool // Reopen recreated files (tail -F)
MustExist bool // Fail early if the file does not exist
Poll bool // Poll for file changes instead of using inotify
Pipe bool // Is a named pipe (mkfifo)
RateLimiter *ratelimiter.LeakyBucket
// Generic IO
Follow bool // Continue looking for new lines (tail -f)
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
}
Config 用来定义文件被读取的方式。
Tail结构体中最重要的是Lines字段,他是存储Line指针来的一个通道。
Line的数据结构为:
Line结构体
type Line struct {
Text string
Time time.Time
Err error // Error from tail
}
这个结构体是用来存储读取的信息。
- 首先初始化配置结构体config
- 调用TailFile函数,并传入文件路径和config,返回有个tail的结构体,tail结构体的Lines字段封装了拿到的信息
- 遍历tail.Lnes字段,取出信息(注意这里要循环的取,因为tail可以实现实时监控)
读取日志
package main
/*
@author RandySun
@create 2021-09-11-14:46
*/
import (
"fmt"
"github.com/hpcloud/tail"
"time"
)
// tail demo
func main() {
fileName := `G:\goproject\go\logAgent\demo\randy.log`
config := tail.Config{
ReOpen: true, // 打开文件
Follow: true, // 文件切割自动重新打开
Location: &tail.SeekInfo{Offset: 0, Whence: 2}, // Location读取文件的位置, Whence更加系统选择参数
MustExist: false, // 允许日志文件不存在
Poll: true, // 轮询
}
// 打开文件读取日志
tails, err := tail.TailFile(fileName, config)
if err != nil {
fmt.Println("tail file failed, err:", err)
return
}
// 开始读取数据
var (
msg *tail.Line
ok bool
)
for {
msg, ok = <-tails.Lines
if !ok {
fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename)
time.Sleep(time.Second) // 读取出错停止一秒
continue
}
fmt.Println("msg:", msg.Text)
}
}
读取日志:
在当下的阶段,必将由程序员来主导,甚至比以往更甚。