go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

news/2024/10/21 11:56:29/

Linux中的tail命令

tail 命令是一个在 Unix/Linux 操作系统上用来显示文件末尾内容的命令。它可以显示文件的最后几行内容,默认情况下显示文件的最后 10 行。tail 命令
非常有用,特别是在我们查看日志文件或者监视文件变化时。
基本用法如下:
tail [选项]… [文件]…
一些常用的选项包括:

  • -n <行数>:显示指定行数的末尾内容。例如,tail -n 20 filename 将显示文件 filename 的最后 20 行。
  • -f:在文件末尾持续输出内容,常用于查看日志文件实时变化。使用 Ctrl + C 终止。
  • -c <字节数>:显示指定字节数的末尾内容。例如,tail -c 100 filename 将显示文件 filename 的最后 100 个字节。

tail包简介

go语言中tail包用于输出文件的最后几行。假设该档案有更新,tail会自己主动刷新,确保我们看到是最新的档案内容 ,在日志收集中可以实时的监测日志的变
化。

下载tail包

tail包的地址为:

github.com/hpcloud/tail

但是这里直接执行的话会报错

PS G:\goproject\-goroutine-\tailfdemo> go get github.com/hpcloud/tail go: gopkg.in/fsnotify.v1@v1.4.9: go.mod has non-....v1 module path "github.com/fsnotify/fsnotify" at revision v1.4.9,
这个主要是因为tail包中有依赖包的名字修改了,所以我们也要做对应的修改:

  • 首先,打开设置,找到自己的GoPath路径:
    在这里插入图片描述

  • 然后到路径下找到tail包:
    在这里插入图片描述

  • 最后对tail代码目录下的inotify.go和inotify_tracker.go两个文件,

将gopkg.in/fsnotify/fsnotify.v1 修改为 github.com/fsnotify/fsnotify, 然后再执行go mod tidy 命令即可。
在这里插入图片描述

  • 加载成功:
    在这里插入图片描述

tail包相关函数及结构体

TailFile函数

func TailFile(filename string, config Config) (*Tail, error) {
}

tail2.TailFile()函数的参数是文件路径和配置文件,会生成一个Tail结构体。在Tail结构体中,最重要的属性是文件名Filename和用于存储文件一行Line
的通道Lines:

type Tail struct {
Filename string
Lines    chan *Line
Configfile   *os.File
reader *bufio.Readerwatcher watch.FileWatcher
changes *watch.FileChangestomb.Tomb // provides: Done, Kill, Dyinglk sync.Mutex
}type Line struct{  //用来存储每一行日志Text stringTime time.TimeErr error
}

除此之外,还有一个结构体Config用来配置tail2.TailFile()函数的参数:

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
}

下面是对一些参数的说明:

  • Location *SeekInfo: 指定文件的起始读取位置。SeekInfo 是一个指针类型,可能包含文件偏移等信息。

  • ReOpen bool: 是否重新打开已经被重新创建的文件。当文件被重新创建时(比如通过 tail -F 命令监视日志文件时),如果设置为 true,则重新打开该文件,继续读取新内容。

  • MustExist bool: 如果文件不存在是否立即报错。当设置为 true 时,如果文件不存在,则会立即报错而不是等待文件出现。

  • Poll bool: 是否使用轮询的方式检查文件变化,而不是使用 inotify。在一些系统上,inotify 可能不可用或者不够稳定,此时可以通过设置为 true 来强制使用轮询方式。

  • Pipe bool: 是否为命名管道(mkfifo)。如果文件是通过 mkfifo 命令创建的命名管道,则设置为 true。

  • RateLimiter *ratelimiter.LeakyBucket: 速率限制器,用于限制文件读取的速率。ratelimiter.LeakyBucket 可能是一个实现了漏桶算法的速率限制器,用于控制读取速度。

  • Follow bool: 是否继续监视文件的新内容(类似于 tail -f 命令)。如果设置为 true,则会持续监视文件,并读取新的行内容。

  • MaxLineSize int: 如果非零,表示最大的行长度。如果读取到的行长度超过该值,则会将其分割成多个行。

  • Logger logger: 日志记录器,用于记录文件读取过程中的日志信息。如果设置为 nil,则会使用默认的日志记录器(tail.DefaultLogger)。如果想禁用日志记录,则可以将该字段设置为 tail.DiscardingLogger。

tail读取日志文件的代码样例;

  • 代码
package mainimport ("fmt""github.com/hpcloud/tail""time"
)func main() {filename := "G:\\goproject\\-goroutine-\\tailfdemo\\time.log"config := tail.Config{Follow:    true,  //进行跟随ReOpen:    true,  //重新打开MustExist: false, //文件打开失败不报错Poll:      true,Location:  &tail.SeekInfo{Offset: 0, Whence: 2},}tail, err := tail.TailFile(filename, config)if err != nil {fmt.Println("tail file failed,err:", err)return}for {line, ok := <-tail.Linesif !ok {fmt.Println("tail file close reopen, filename: ", tail.Filename)time.Sleep(1 * time.Second)continue}fmt.Println("line:", line.Text)}
}

这里我们输入log文件中,输出控制台就会实时更新了:
在这里插入图片描述

总结

  • 流程:
    • 首先定义Config结构体,初始化配置文件
    • 利用TailFile函数得到Tail结构体,Tail结构体中的Lines封装了拿到的信息
    • 循环遍历Tail.Lines,取出信息,可以实现实时监控

http://www.ppmy.cn/news/1436898.html

相关文章

npm镜像源的查看和切换

前言 原域名https://registry.npm.taobao.org/ 原来的淘宝镜像已经不行了,当npm去taobao时,会出现一个证书过期的提示. 下面的是最新的地址: 切换到淘宝镜像(最新的地址) #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com…

MyCat 数据库中间件

一、介绍 1、单数据库进行数据存储的问题&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足以容纳这些热点数据&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源。 2、…

解释一下“暂存区”的概念,在Git中它扮演什么角色?

文章目录 暂存区在Git中的概念与作用什么是暂存区&#xff08;Staging Area&#xff09;暂存区的位置和结构 暂存区在Git工作流程中的角色1. 分离工作区与版本库的交互示例代码与操作步骤示例1&#xff1a;将工作区的修改添加至暂存区 2. 控制提交内容的粒度示例2&#xff1a;分…

C++修炼之路之多态---多态的原理(虚函数表)

目录 一&#xff1a;多态的原理 1.虚函数表 2.原理分析 3.对于虚表存在哪里的探讨 4.对于是不是所有的虚函数都要存进虚函数表的探讨 二&#xff1a;多继承中的虚函数表 三&#xff1a;常见的问答题 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗--…

Linux 修改远程默认端口-22

1 编辑sshd配置&#xff0c;修改默认的端口 vi /etc/ssh/sshd_config #添加新的端口 port 62222 ps&#xff1a;先添加新的端口&#xff0c;用新端口能远程登录后再注销22端口&#xff0c;防止修改有问题&#xff0c;导致22端口也不能远程登录 2 重启sshd /etc/init.d/sshd r…

java 项目中日志规范处理和异常规范处理问题

在 Java 中&#xff0c;可以使用全局异常处理器&#xff08;Global Exception Handler&#xff09;来集中处理异常。要实现全局异常处理&#xff0c;需要创建一个类并使用 ControllerAdvice 注解标记该类&#xff0c;然后在该类中定义一个或多个方法&#xff0c;并使用 Excepti…

帮助中心系统搭建不再是难题,这几个工具来帮你

在面临客户服务挑战时&#xff0c;有效的帮助中心系统是提升用户满意度和解决问题效率的关键。幸运的是&#xff0c;搭建一个功能全面的帮助中心不再是什么难事。下面&#xff0c;我要为你介绍三款能够帮忙打造帮助中心的超实用工具&#xff0c;让你的客户支持体验迅速升级。 1…

vue3 emits: [‘update:modelValue‘]

在 Vue.js 中&#xff0c;emits 选项用于声明组件可以触发的事件。[update:modelValue] 是 Vue 3 中用于自定义组件与 v-model 指令配合工作的特殊事件名。 当您使用 v-model 指令与自定义组件进行双向绑定时&#xff0c;Vue 内部实际上是在做以下操作&#xff1a; 将 value …