温馨提示×

debian golang日志怎么解析

小樊
41
2026-09-04 01:54:21
栏目: 编程语言

在 Debian 上用 Go 解析日志,通常分三种常见场景:

  1. 解析系统日志(如 /var/log/syslog/var/log/auth.log
  2. 解析自定义应用日志(JSON / 文本格式)
  3. 实时跟踪日志(tail -f 效果)

下面按场景给你说明。


一、解析 Debian 系统日志

Debian 默认使用 rsyslog,日志格式一般是:

Jun 10 12:34:56 debian sshd[1234]: Accepted password for root from 1.2.3.4 port 5678 ssh2

示例:用 Go 解析 syslog 文本

package main

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
	"strings"
)

func main() {
	file, _ := os.Open("/var/log/auth.log")
	defer file.Close()

	re := regexp.MustCompile(`(\w{3}\s+\d+ \d{2}:\d{2}:\d{2}) (\w+) (\w+)\[(\d+)\]: (.*)`)

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		m := re.FindStringSubmatch(line)
		if m == nil {
			continue
		}
		fmt.Printf("Time: %s\nHost: %s\nProcess: %s\nPID: %s\nMsg: %s\n\n",
			m[1], m[2], m[3], m[4], m[5])
	}
}

二、解析 JSON 格式日志(推荐)

如果是你自己写的 Go 程序,建议直接输出 JSON 日志:

{"time":"2026-01-21T10:00:00Z","level":"info","msg":"user login","user":"alice"}

Go 解析示例

type LogEntry struct {
	Time  string `json:"time"`
	Level string `json:"level"`
	Msg   string `json:"msg"`
	User  string `json:"user"`
}

func parseJSONLog(line string) {
	var l LogEntry
	json.Unmarshal([]byte(line), &l)
}

工具推荐:

  • logrus
  • zap
  • slog(Go 1.21+ 官方)

三、实时解析日志(类似 tail -f)

使用 github.com/hpcloud/tail

go get github.com/hpcloud/tail
package main

import (
	"fmt"
	"github.com/hpcloud/tail"
)

func main() {
	t, _ := tail.TailFile(
		"/var/log/syslog",
		tail.Config{
			Follow: true,
			Location: &tail.SeekInfo{Offset: 0, Whence: 2},
		},
	)

	for line := range t.Lines {
		fmt.Println(line.Text)
	}
}

四、Debian 特有注意事项

  1. 日志权限

    sudo usermod -aG adm youruser
    

    否则可能读不了 /var/log

  2. systemd 日志 Debian 也支持 journalctl

    journalctl -u nginx -f
    

    Go 可直接执行命令解析:

    exec.Command("journalctl", "-u", "nginx", "-f")
    

五、推荐方案(总结)

场景 推荐方式
系统日志 正则解析
应用日志 JSON + slog
实时监控 tail / journalctl
生产环境 JSON + filebeat + ES

如果你能告诉我:

  • 系统日志还是应用日志
  • 日志 格式示例
  • 是否要 实时解析

我可以直接给你一整套可用的 Go 代码。

0