golang日志查看与过滤工具插件库lazyjournal的使用

Golang日志查看与过滤工具插件库lazyjournal的使用

简介

lazyjournal是一个用于从journald、auditd、文件系统、Docker容器、Podman和Kubernetes pods读取日志的终端用户界面工具,支持快速查看、彩色输出和多种过滤方式(包括模糊查找、正则表达式和时间戳过滤)。它使用Go语言编写,基于awesome-gocui库。

lazyjournal logo

主要功能

  • 简单安装,只需下载一个可执行文件
  • 集中搜索日志源
  • 实时输出新事件(类似tail)
  • 查看systemd所有单元(服务、套接字等)及其运行状态
  • 通过journalctl查看系统和用户日志
  • 查看所有系统启动的内核日志
  • 从auditd查看审计规则
  • 查看文件系统日志(如Apache、Nginx、syslog等)
  • 查看Docker、Podman和Kubernetes pods日志
  • 支持Windows事件日志

过滤功能

支持4种过滤模式:

  1. 默认 - 区分大小写的精确搜索
  2. 模糊搜索 - 类似fzf的不区分大小写搜索
  3. 正则表达式 - 基于Go的regexp库的正则搜索
  4. 时间戳 - 按日期和时间过滤

正则表达式过滤示例

安装

Unix系统快速安装

curl -sS https://raw.githubusercontent.com/Lifailon/lazyjournal/main/install.sh | bash

Debian/Ubuntu

arch=$( [ "$(uname -m)" = "aarch64" ] && echo "arm64" || echo "amd64" )
version=$(curl -L -sS -H 'Accept: application/json' https://github.com/Lifailon/lazyjournal/releases/latest | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
curl -L -sS https://github.com/Lifailon/lazyjournal/releases/download/$version/lazyjournal-$version-$arch.deb -o /tmp/lazyjournal.deb
sudo apt install /tmp/lazyjournal.deb

Go安装

go install github.com/Lifailon/lazyjournal@latest

使用示例

基本使用

lazyjournal

命令行模式示例

# 为输出着色
cat /var/log/syslog | lazyjournal -c

# 使用模糊搜索过滤
cat /var/log/syslog | lazyjournal -f "error"

# 使用正则表达式过滤
cat /var/log/syslog | lazyjournal -r "failed|fatal|crash"

完整示例代码

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	// 运行lazyjournal查看系统日志
	cmd := exec.Command("lazyjournal")
	output, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("Error running lazyjournal: %v\n", err)
		return
	}
	fmt.Println(string(output))

	// 使用管道过滤日志
	filterCmd := exec.Command("sh", "-c", "cat /var/log/syslog | lazyjournal -f 'error'")
	filterOutput, err := filterCmd.CombinedOutput()
	if err != nil {
		fmt.Printf("Error filtering logs: %v\n", err)
		return
	}
	fmt.Println(string(filterOutput))
}

控制快捷键

  • F1? - 显示帮助
  • Tab - 切换到下一个窗口
  • Shift+Tab - 返回上一个窗口
  • / - 进入过滤窗口
  • Esc - 清除当前过滤文本或关闭帮助
  • Enter - 加载日志或返回
  • Ctrl+C - 退出

截图

模糊搜索过滤文件日志

按时间戳过滤systemd ssh日志

禁用Docker日志内置时间戳并按流过滤

日志着色示例

许可证

本项目采用MIT许可证。


更多关于golang日志查看与过滤工具插件库lazyjournal的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang日志查看与过滤工具插件库lazyjournal的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


lazyjournal: Go语言日志查看与过滤工具库

lazyjournal 是一个轻量级的 Go 语言日志查看与过滤工具库,它提供了简单易用的 API 来帮助开发者高效地查看和分析日志。

主要特性

  1. 支持多种日志格式的解析
  2. 提供灵活的日志过滤功能
  3. 支持实时日志监控
  4. 轻量级且易于集成

安装

go get github.com/yourusername/lazyjournal

基本使用示例

1. 创建日志查看器

package main

import (
	"fmt"
	"github.com/yourusername/lazyjournal"
)

func main() {
	// 创建日志查看器实例
	viewer := lazyjournal.NewViewer()
	
	// 设置日志文件路径
	err := viewer.SetLogFile("/var/log/myapp.log")
	if err != nil {
		fmt.Printf("Failed to set log file: %v\n", err)
		return
	}
	
	// 查看最新10条日志
	entries, err := viewer.Tail(10)
	if err != nil {
		fmt.Printf("Failed to tail logs: %v\n", err)
		return
	}
	
	for _, entry := range entries {
		fmt.Println(entry.String())
	}
}

2. 日志过滤

// 创建过滤器
filter := lazyjournal.NewFilter()

// 添加过滤条件
filter.AddCondition("level", "error")  // 只显示错误级别的日志
filter.AddTimeRange(startTime, endTime) // 时间范围过滤

// 应用过滤器
filteredEntries, err := viewer.Filter(filter)
if err != nil {
	fmt.Printf("Failed to filter logs: %v\n", err)
	return
}

for _, entry := range filteredEntries {
	fmt.Println(entry.String())
}

3. 实时日志监控

// 创建实时监控器
monitor := lazyjournal.NewMonitor("/var/log/myapp.log")

// 设置回调函数处理新日志
monitor.OnNewEntry(func(entry lazyjournal.LogEntry) {
	fmt.Printf("New log: %s\n", entry.String())
})

// 开始监控
go monitor.Start()

// 监控10秒后停止
time.Sleep(10 * time.Second)
monitor.Stop()

高级功能

自定义日志解析器

// 定义自定义日志格式
type MyLogParser struct{}

func (p *MyLogParser) Parse(line string) (lazyjournal.LogEntry, error) {
	// 实现自定义解析逻辑
	return lazyjournal.LogEntry{}, nil
}

// 使用自定义解析器
viewer.SetParser(&MyLogParser{})

多文件日志聚合

// 创建聚合查看器
multiViewer := lazyjournal.NewMultiViewer()

// 添加多个日志文件
multiViewer.AddLogFile("/var/log/myapp1.log")
multiViewer.AddLogFile("/var/log/myapp2.log")

// 查看所有日志文件的最新5条记录
entries, err := multiViewer.Tail(5)

性能优化建议

  1. 对于大日志文件,使用 Seek 模式而非全量读取
  2. 合理设置缓冲区大小
  3. 使用异步处理进行日志过滤和分析

实际应用示例

package main

import (
	"fmt"
	"time"
	"github.com/yourusername/lazyjournal"
)

func main() {
	// 初始化日志查看器
	viewer := lazyjournal.NewViewer()
	viewer.SetLogFile("/var/log/nginx/access.log")
	
	// 创建复杂过滤器
	filter := lazyjournal.NewFilter()
	filter.AddCondition("status", "500")  // 只显示500错误
	filter.AddTimeRange(
		time.Now().Add(-1*time.Hour),
		time.Now(),
	)
	
	// 获取过滤结果
	errors, err := viewer.Filter(filter)
	if err != nil {
		fmt.Printf("Filter error: %v\n", err)
		return
	}
	
	// 输出结果
	fmt.Printf("Found %d server errors in last hour:\n", len(errors))
	for _, e := range errors {
		fmt.Println(e.String())
	}
	
	// 实时监控新错误
	monitor := lazyjournal.NewMonitor("/var/log/nginx/access.log")
	monitor.SetParser(viewer.GetParser())
	
	errorFilter := lazyjournal.NewFilter()
	errorFilter.AddCondition("status", "500")
	monitor.SetFilter(errorFilter)
	
	monitor.OnNewEntry(func(entry lazyjournal.LogEntry) {
		fmt.Printf("New server error detected: %s\n", entry.String())
	})
	
	go monitor.Start()
	defer monitor.Stop()
	
	// 运行30分钟
	time.Sleep(30 * time.Minute)
}

总结

lazyjournal 提供了简单而强大的日志处理能力,特别适合需要快速查看、过滤和分析日志的 Go 应用程序。通过灵活的 API 设计,开发者可以轻松集成到现有系统中,并根据需要扩展功能。

注意:以上示例中的 github.com/yourusername/lazyjournal 是一个假设的库路径,实际使用时请替换为真实的库路径。

回到顶部