Go第三方库之tail
Tail Demo
// tail.TailFile()函数开启goroutine去读取文件,通过channel格式的t.lines传递内容。 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)
源码详解
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 func TailFile // func TailFile(filename string, config Config) (*Tail, error) func (*Tail) Cleanup // func (tail *Tail) Cleanup() func (*Tail) Stop ¶ Uses // func (tail *Tail) Stop() error func (*Tail) StopAtEOF // func (tail *Tail) StopAtEOF() error func (*Tail) Tell // func (tail *Tail) Tell() (offset int64, err error)
Demo
package main import ( "fmt" "github.com/hpcloud/tail" ) func main() { var ( line *tail.Line ok bool ) // log文件名 fileName := "./log.log" // 设置config config := tail.Config{ Location: &tail.SeekInfo{ Offset: 0, Whence: 0, }, Poll: true, ReOpen: true, MustExist: false, Follow: true, } // 创建tail句柄 tails, err := tail.TailFile(fileName, config) if err != nil { fmt.Println("error->", err) return } for { // 通过管道获取到每条行数据 line, ok = <-tails.Lines fmt.Println("走这里了" ) if !ok { fmt.Println("tail file close,fileName:", tails.Filename) continue } fmt.Println("line:", line) } }
Songzhibin