zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JAVA共通関数文字列の長さを求める
    JAVA共通関数文字コード変換
    JAVA共通関数文字列に空白を追加する
    JAVA共通関数 半角英数字チェック
    JAVA共通関数項目が半角09か判断する
    JAVA共通関数 指定日の曜日を算出する
    linux添加静态路由(rhel5.4)
    ubuntu编译opencapwap报错解决
    Wireshark网络抓包(二)——过滤器
    net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse回收tcp连接总结
  • 原文地址:https://www.cnblogs.com/binHome/p/12171741.html
Copyright © 2011-2022 走看看