在 Debian 上运行 Golang 程序时,“日志过滤”通常指的是 查看/筛选程序输出的日志。下面按常见场景给你几种实用做法。
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")
}
✅ 优点:不依赖系统
✅ 适合生产环境
Uber zap / logrus 等日志库
logger, _ := zap.NewDevelopment()
defer logger.Sync()
logger.Info("info log")
logger.Error("error log")
运行:
go run main.go 2>&1 | grep ERROR
grep 过滤./myapp 2>&1 | grep ERROR
只看 ERROR:
./myapp | grep -E "ERROR|FATAL"
排除 DEBUG:
./myapp | grep -v DEBUG
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"
./myapp > app.log 2>&1
grep ERROR app.log
docker logs mycontainer | grep ERROR
kubectl logs pod-name | grep ERROR
| 场景 | 推荐方式 |
|---|---|
| 开发调试 | grep |
| 生产服务 | 日志库(zap/logrus)+ 级别 |
| systemd 服务 | journalctl |
| 容器 | docker logs / kubectl logs |
如果你愿意,可以告诉我:
我可以给你一个完全贴合你环境的示例。