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

  

05-29 00:05