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

}

  

posted @ 2020-01-09 15:27  Binb  阅读(707)  评论(0编辑  收藏  举报