温馨提示×

Debian Golang日志怎么过滤

小樊
36
2026-08-11 21:26:45
栏目: 编程语言

在 Debian 上运行 Golang 程序时,“日志过滤”通常指的是 查看/筛选程序输出的日志。下面按常见场景给你几种实用做法。


一、Golang 程序本身过滤(推荐)

1️⃣ 使用 log.SetOutput + 自定义过滤

package main

import (
    "io"
    "log"
    "os"
    "strings"
)

type LogFilter struct {
    writer io.Writer
    allow  []string
}

func (f *LogFilter) Write(p []byte) (n int, err error) {
    if containsAny(string(p), f.allow) {
        return f.writer.Write(p)
    }
    return len(p), nil
}

func containsAny(s string, keywords []string) bool {
    for _, k := range keywords {
        if strings.Contains(s, k) {
            return true
        }
    }
    return false
}

func main() {
    log.SetOutput(&LogFilter{
        writer: os.Stdout,
        allow:  []string{"ERROR", "FATAL"},
    })

    log.Println("INFO: this will not show")
    log.Println("ERROR: this will show")
}

✅ 优点:不依赖系统
✅ 适合生产环境


2️⃣ 使用日志级别(推荐)

Uber zap / logrus 等日志库

zap 示例

logger, _ := zap.NewDevelopment()
defer logger.Sync()

logger.Info("info log")
logger.Error("error log")

运行:

go run main.go 2>&1 | grep ERROR

二、Debian 系统层面过滤 Golang 日志

1️⃣ 用 grep 过滤

./myapp 2>&1 | grep ERROR

只看 ERROR:

./myapp | grep -E "ERROR|FATAL"

排除 DEBUG:

./myapp | grep -v DEBUG

2️⃣ 使用 journalctl(systemd 服务)

如果 Golang 程序是 systemd 服务:

# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal
StandardError=journal

查看日志:

journalctl -u myapp -f

过滤:

journalctl -u myapp | grep ERROR

按时间:

journalctl -u myapp --since "5 min ago"

3️⃣ 输出到文件再过滤

./myapp > app.log 2>&1
grep ERROR app.log

三、Docker / Kubernetes(常见)

docker logs mycontainer | grep ERROR
kubectl logs pod-name | grep ERROR

四、推荐方案总结

场景 推荐方式
开发调试 grep
生产服务 日志库(zap/logrus)+ 级别
systemd 服务 journalctl
容器 docker logs / kubectl logs

如果你愿意,可以告诉我:

  • ✅ 是 直接运行 还是 systemd
  • ✅ 用的是 标准 log 还是 zap / logrus
  • ✅ 想按 级别 / 关键字 / 时间 过滤

我可以给你一个完全贴合你环境的示例

0