golang使用tail实现追踪文件变更

 更新时间:2023年08月08日 10:49:37   作者:花酒锄作田  
这篇文章主要为大家介绍了golang如何借助 github.com/hpcloud/tail ,实现实时追踪文件变更,达到类似shell命令tail -f的效果,感兴趣的小伙伴可以了解一下

简介

借助 github.com/hpcloud/tail ,可以实时追踪文件变更,达到类似shell命令tail -f的效果。

示例代码

以下示例代码用于实时读取nginx的access.log日志文件,读取到后输出到控制台。如果nginx日志做了json格式化,还可以解析读取到的内容,对日志进行更多处理,比如日志内容写入数据库、做日志告警等,对于访问量较小的系统来说,这样就不需要消耗很多资源去搭建ELK、Loki等专门的日志监控系统。

package main
import (
	"flag"
	"fmt"
	"io"
	"os"
	"github.com/hpcloud/tail"
)
var (
	logfile = flag.String("f", "access.log", "日志文件路径")
)
func main() {
	flag.Parse()
	// 判断文件是否存在
	if _, err := os.Stat(*logfile); os.IsNotExist(err) {
		fmt.Printf("Error! %s not found\n", *logfile)
		os.Exit(1)
	}
	// 不从文件开始读, 而是从文件当前末尾开始读
	// Go 1.20推荐使用 io.SeekEnd, 老版本可能需要改为os.SEEK_END
	seek := &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}
	t, err := tail.TailFile(*logfile, tail.Config{
		Follow:   true,
		Location: seek,
	})
	if err != nil {
		fmt.Println(err)
	}
	for line := range t.Lines {
		fmt.Println(line.Text)
	}
}

知识补充

1.官方文档

2.github.com/hpcloud/tail 使用介绍

地址: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

到此这篇关于golang使用tail实现追踪文件变更的文章就介绍到这了,更多相关golang tail内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang基于Vault实现敏感信息保护

    Golang基于Vault实现敏感信息保护

    Vault 是一个强大的敏感信息管理工具,自带了多种认证引擎和密码引擎,本文主要探讨应用程序如何安全地从 Vault 获取敏感信息,并进一步实现自动轮转,感兴趣的可以了解一下
    2023-06-06
  • 3个Go语言中实用重构技术分享

    3个Go语言中实用重构技术分享

    代码重构是在不改变外部功能的情况下对现有代码进行改进,是编程的核心部分之一,本文为大家介绍了Go语言中3个实用重构技术,需要的可以参考一下
    2023-06-06
  • Golang对mongodb进行聚合查询详解

    Golang对mongodb进行聚合查询详解

    这篇文章主要为大家详细介绍了Golang对mongodb进行聚合查询的方法,文中的示例代码讲解详细,对我们学习Golang有一点的帮助,需要的可以参考一下
    2023-02-02
  • Go语言实战之切片内存优化

    Go语言实战之切片内存优化

    Go 语言的切片是一个动态的数据结构,可以方便地对其进行扩容和缩容操作。这篇文章主要为大家详细介绍了Go语言如何实现切片内存优化,需要的可以参考一下
    2023-03-03
  • 重学Go语言之文件操作详解

    重学Go语言之文件操作详解

    有很多场景都需要对文件进行读取或者写入,比如读取配置文件或者写入日志文件,在Go语言中,操作文件应该算是一件比较简单的事情,我们在这一篇文章中,一起来探究一下
    2023-08-08
  • golang metrics各个指标含义讲解说明

    golang metrics各个指标含义讲解说明

    这篇文章主要为大家介绍了golang metrics各个指标含义讲解说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言LeetCode题解706设计哈希映射

    Go语言LeetCode题解706设计哈希映射

    这篇文章主要为大家介绍了Go语言LeetCode题解706设计哈希映射示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Golang开发之字符串与切片问题踩坑记录

    Golang开发之字符串与切片问题踩坑记录

    字符串和切片,都是golang常用的两种内置数据类型,最近在日常工作中,遇到了一个字符串切片导致的问题,记录一下排查问题的过程,避免后续在这种场景上踩坑
    2023-07-07
  • 一文详解Golang的模块版本管理与语义版本控制

    一文详解Golang的模块版本管理与语义版本控制

    在Golang中,模块(module)是Go 1.11版本引入的依赖管理系统,帮助开发者管理项目的依赖,在Go模块推出之前,开发者通常使用GOPATH和vendor目录来管理项目的依赖,本文将给大家详细介绍Golang的模块版本管理与语义版本控制,需要的朋友可以参考下
    2023-12-12
  • 如何用Go判断元素是否在切片中

    如何用Go判断元素是否在切片中

    切片(Slice)是一个拥有相同类型元素的可变长度的序列,下面这篇文章主要给大家介绍了关于如何用Go判断元素是否在切片中的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06

最新评论