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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: go语言并发实战——日志收集系统(四) 利用tail包实现对日志文件的实时监控

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
Config
file   *os.File
reader *bufio.Reader
watcher watch.FileWatcher
changes *watch.FileChanges
tomb.Tomb // provides: Done, Kill, Dying
lk sync.Mutex
}
type Line struct{  //用来存储每一行日志
  Text string
  Time time.Time
  Err 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 main
import (
  "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.Lines
    if !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,取出信息,可以实现实时监控
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
打赏
0
0
0
0
13
分享
相关文章
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
31 10
|
1月前
|
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
50 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。
内网监控系统之 Go 语言布隆过滤器算法深度剖析
在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
42 5
开箱即用的GO后台管理系统 Kratos Admin - 前端权限
Kratos Admin 是一个开箱即用的 GO 后台管理系统,前端权限管理分为路由和按钮权限。路由权限支持后端动态生成和前端固定配置两种方式,通过 `.env` 文件配置 `VITE_ROUTER_ACCESS_MODE` 实现。按钮权限可通过权限码或角色控制,支持组件、API 和指令三种方式。项目代码托管于 Gitee 和 Github。
31 0
开箱即用的GO后台管理系统 Kratos Admin - 列表查询规则
Kratos Admin 是一个开箱即用的GO后台管理系统,支持通用列表查询请求。通过 `page`、`pageSize`、`query`(AND过滤)、`or`(OR过滤)、`orderBy`(排序)、`noPaging`(不分页)和 `fieldMask`(字段掩码)等参数,灵活配置查询条件。过滤规则遵循Python ORM风格,支持多种查找类型如 `in`、`gte`、`icontains` 等,适用于不同数据库。
31 0
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
37 0
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
252 1
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
104 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等