在 Debian 上运行 Golang 服务时,“日志检索”通常取决于日志写在哪里、用什么方式管理。下面按常见场景给你一套实用方案。
很多 Go 程序直接 log.Println 或 fmt.Println:
log.Println("service started")
如果是 systemd 启动的服务,日志在 journald 中。
查看:
journalctl -u your-service.service
实时查看:
journalctl -u your-service.service -f
按时间:
journalctl -u your-service.service --since "2024-01-01" --until "2024-01-02"
关键字检索:
journalctl -u your-service.service | grep ERROR
常见写法:
log.SetOutput(os.OpenFile("/var/log/app.log", ...))
检索方式:
# 查看
less /var/log/app.log
# 关键字
grep ERROR /var/log/app.log
# 实时
tail -f /var/log/app.log
# 时间范围
sed -n '/2024-01-01 10:00/,/2024-01-01 11:00/p' /var/log/app.log
logger, _ := zap.NewProduction()
logger.Error("db connect failed", zap.String("host", "127.0.0.1"))
日志示例:
{"level":"error","ts":1700000000,"msg":"db connect failed","host":"127.0.0.1"}
检索:
grep '"level":"error"' app.log
或用 jq:
jq 'select(.level=="error")' app.log
grep -i error /var/log/app.log
zgrep ERROR /var/log/app.log.1.gz
less /var/log/app.log
/ERROR
journalctl -u go-app -p err
apt install lnav # 高级日志查看器
lnav /var/log/app.log
✅ 使用结构化日志(zap / slog)
✅ 输出到 stdout,由 systemd 管理
✅ 日志带 level / time / trace_id
✅ 不要自己写日志轮转,用 logrotate
如果你愿意,可以告诉我:
我可以直接给你最合适的一条命令或配置。