tail包读取文件的简单应用
2022/3/28 6:25:55
本文主要是介绍tail包读取文件的简单应用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
tail包的作用
tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,
假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容 ,在日志收集中可以实时的监测日志的变化。
用法
package main import ( "fmt" "time" "github.com/hpcloud/tail" ) // tailf的用法示例 func main() { fileName := "./my.log" config := tail.Config{ ReOpen: true, // 重新打开 Follow: true, // 是否跟随 Location: &tail.SeekInfo{Offset: 0, Whence: 2}, // 从文件的哪个地方开始读 MustExist: false, // 文件不存在不报错 Poll: true, } tails, err := tail.TailFile(fileName, config) if err != nil { fmt.Println("tail file failed, err:", err) return } var ( line *tail.Line ok bool ) for { line, ok = <-tails.Lines//遍历chan,读取日志内容 if !ok { fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename) time.Sleep(time.Second) continue } fmt.Println("line:", line.Text) } }
源码解读
type 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
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的数据结构为:
type Line
type Line struct { Text string Time time.Time Err error // Error from tail }
这个结构体是用来存储读取的信息。
最后简要总结一下流程:
- 首先初始化配置结构体config
- 调用TailFile函数,并传入文件路径和config,返回有个tail的结构体,tail结构体的Lines字段封装了拿到的信息
- 遍历tail.Lnes字段,取出信息(注意这里要循环的取,因为tail可以实现实时监控)
贴上实战代码:
package taillog import ( "fmt" "github.com/hpcloud/tail" ) var ( tailObj *tail.Tail //LogChan chan string ) func Init (filename string)(err error){ config := tail.Config{ // File-specifc Location: &tail.SeekInfo{Offset: 0, Whence: 2}, // 从文件那个位置开始读 ReOpen: true, //是否重新打开 MustExist: false, // Fail early if the file does notexist Poll: true, // Poll for file changes instead of using inotify Follow: true, // Continue looking for new lines (tail -f) } tailObj,err = tail.TailFile(filename, config) //TailFile(filename, config) if err != nil { fmt.Println("tail file err=", err) return } return } func ReadChan()<-chan *tail.Line{ return tailObj.Lines }
这篇关于tail包读取文件的简单应用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15Tailwind开发入门教程:从零开始搭建第一个项目
- 2024-11-14Emotion教程:新手入门必备指南
- 2024-11-14音频生成的秘密武器:扩散模型在音乐创作中的应用
- 2024-11-14从数据科学家到AI开发者:2023年构建生成式AI网站应用的经验谈
- 2024-11-14基于AI的智能调试助手创业点子:用代码样例打造你的调试神器!
- 2024-11-14受控组件学习:从入门到初步掌握
- 2024-11-14Emotion学习入门指南
- 2024-11-14Emotion学习入门指南
- 2024-11-14获取参数学习:初学者指南
- 2024-11-14受控组件学习:从入门到实践