在 Linux 下对 Golang 程序日志进行过滤,常见做法分为 代码层过滤 和 系统/命令行过滤 两类。下面按场景给你总结。
log + 级别控制package main
import (
"log"
"os"
)
var debug = false
func main() {
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags)
log.Println("info log")
if debug {
log.Println("debug log")
}
}
运行:
debug=true go run main.go
log/slog(Go 1.21+,推荐)package main
import (
"log/slog"
"os"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo, // 只输出 Info 及以上
}))
logger.Debug("debug msg") // 不会输出
logger.Info("info msg")
logger.Error("error msg")
}
⚠️ 可动态切换级别:
slog.SetLogLoggerLevel(slog.LevelDebug)
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("info")
logger.Debug("debug") // 生产环境默认不输出
log := logrus.New()
log.SetLevel(logrus.InfoLevel)
log.Debug("debug") // 不输出
log.Info("info")
grep 基础过滤./app | grep ERROR
忽略大小写:
./app | grep -i error
排除某类日志:
./app | grep -v DEBUG
./app | grep -E "ERROR|WARN"
./app | tail -n 100 | grep ERROR
./app | tee app.log
tail -f app.log | grep ERROR
journalctl -u myapp.service | grep ERROR
实时:
journalctl -u myapp.service -f | grep ERROR
按优先级:
journalctl -u myapp.service -p err
awkawk '/ERROR/ {print}' app.log
grep "2026-01-21 10:" app.log | grep ERROR
✅ 生产环境
slog / zap✅ 开发环境
✅ 避免
if strings.Contains如果你愿意,可以告诉我:
我可以直接给你一份可复制的配置或命令。