在 Debian 上用 Go 解析日志,通常分三种常见场景:
/var/log/syslog、/var/log/auth.log)下面按场景给你说明。
Debian 默认使用 rsyslog,日志格式一般是:
Jun 10 12:34:56 debian sshd[1234]: Accepted password for root from 1.2.3.4 port 5678 ssh2
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])
}
}
如果是你自己写的 Go 程序,建议直接输出 JSON 日志:
{"time":"2026-01-21T10:00:00Z","level":"info","msg":"user login","user":"alice"}
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)
}
工具推荐:
logruszapslog(Go 1.21+ 官方)github.com/hpcloud/tailgo 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)
}
}
日志权限
sudo usermod -aG adm youruser
否则可能读不了 /var/log
systemd 日志
Debian 也支持 journalctl
journalctl -u nginx -f
Go 可直接执行命令解析:
exec.Command("journalctl", "-u", "nginx", "-f")
| 场景 | 推荐方式 |
|---|---|
| 系统日志 | 正则解析 |
| 应用日志 | JSON + slog |
| 实时监控 | tail / journalctl |
| 生产环境 | JSON + filebeat + ES |
如果你能告诉我:
我可以直接给你一整套可用的 Go 代码。