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

    这个结构体是用来存储读取的信息。

    1. 首先初始化配置结构体config
    2. 调用TailFile函数,并传入文件路径和config,返回有个tail的结构体,tail结构体的Lines字段封装了拿到的信息
    3. 遍历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)
    	}
    }
    
    

    读取日志:

    image-20210911151310087

    image-20210911151239167

    image-20210911171022314

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 35
    边工作边刷题:70天一遍leetcode: day 36
    边工作边刷题:70天一遍leetcode: day 37-2
    边工作边刷题:70天一遍leetcode: day 37
    边工作边刷题:70天一遍leetcode: day 37-1
    边工作边刷题:70天一遍leetcode: day 38-2
    边工作边刷题:70天一遍leetcode: day 38-1
    边工作边刷题:70天一遍leetcode: day 38
    边工作边刷题:70天一遍leetcode: day 38-2
    边工作边刷题:70天一遍leetcode: day 38-1
  • 原文地址:https://www.cnblogs.com/randysun/p/15676085.html
Copyright © 2020-2023  润新知