温馨提示×

怎样过滤linux golang日志

小樊
43
2026-09-05 15:14:15
栏目: 编程语言

在 Linux 下对 Golang 程序日志进行过滤,常见做法分为 代码层过滤系统/命令行过滤 两类。下面按场景给你总结。


一、代码层过滤(推荐,最可控)

1. 使用标准库 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

2. 使用 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)

3. 使用第三方日志库(更灵活)

zap

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

logger.Info("info")
logger.Debug("debug") // 生产环境默认不输出

logrus

log := logrus.New()
log.SetLevel(logrus.InfoLevel)

log.Debug("debug") // 不输出
log.Info("info")

二、Linux 命令行过滤(运行后)

1. grep 基础过滤

./app | grep ERROR

忽略大小写:

./app | grep -i error

排除某类日志:

./app | grep -v DEBUG

2. 多条件过滤

./app | grep -E "ERROR|WARN"

3. 按时间 / 行号过滤

./app | tail -n 100 | grep ERROR

4. 实时日志(类似 tail -f)

./app | tee app.log
tail -f app.log | grep ERROR

三、systemd 场景(服务运行)

查看并过滤

journalctl -u myapp.service | grep ERROR

实时:

journalctl -u myapp.service -f | grep ERROR

按优先级:

journalctl -u myapp.service -p err

四、日志文件过大时的高级过滤

1. 使用 awk

awk '/ERROR/ {print}' app.log

2. 按时间窗口

grep "2026-01-21 10:" app.log | grep ERROR

五、最佳实践建议

生产环境

  • 使用 slog / zap
  • 日志输出到 stdout
  • 由 systemd / docker / k8s 收集

开发环境

  • 打开 Debug
  • 命令行 grep 快速定位

避免

  • 在代码里写大量 if strings.Contains
  • 日志无级别

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

  • 你用的是 哪种日志库
  • 命令行运行 / systemd / docker
  • 想按 级别 / 关键字 / 时间 过滤

我可以直接给你一份可复制的配置或命令。

0