参考
https://github.com/hpcloud/tail
linux中的tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容。
这个包实现了类似的功能。
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)
}
tail.TailFile()函数开启goroutine去读取文件,通过channel格式的t.lines传递内容。
其他配置项
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
}
location类似os.seek,举例
seek := &tail.SeekInfo{Offset:5,Whence:os.SEEK_CUR}
t, err := tail.TailFile("my.log", tail.Config{Location:seek})
offset //Whence之后,再偏移n个字符开始读,偏移量大于一行内容时换行继续计算(换行符\n计算在内占两个字符,但是不打印出来)
SEEK_SET int = 0 // 跳到文件的开始位置
SEEK_CUR int = 1 // 跳到文件的当前位置(好像和设置为开始位置一样)
SEEK_END int = 2 // 跳到文件最后,不读取文件里原有的内容,从新加入的开始读
t.Tell()返回当前offset