echo 的 logger.formatter 是只读字段,需通过 e.use() 注册新 logger 中间件替换;consolewriter 适用于开发(彩色可读文本),jsonwriter 适用于生产(标准 json);trace_id 可通过 logger.with().str("trace_id", id).logger() 注入,兼容两者;tint.handler 与 echo 的 zerolog 不兼容,不建议强行桥接。

echo.Logger.Formatter 直接赋值会 panic
不能写 e.Logger.Formatter = myFormatter,这是只读字段。Echo 启动后默认 logger 实例是不可变的,强行修改会触发 runtime panic:「assignment to entry in nil map」或「cannot assign to struct field」。必须用 e.Use() 注册全新构造的 logger 中间件,替换掉默认行为。
ConsoleWriter 和 JSONWriter 的选择逻辑
两者都来自 zerolog,但用途截然不同:
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
-
zerolog.ConsoleWriter:适合开发/调试环境,输出带颜色、缩进、可读时间(如"2006-01-02 15:04:05")的文本;设NoColor = true可禁用颜色,用于 CI 或容器日志采集 -
zerolog.JSONWriter:适合生产环境对接 Loki、ELK 等系统,输出纯 JSON,字段名固定(time、level、message、path等),不带颜色、无换行控制 - 二者都需显式传入
os.Stdout或io.Writer,且TimeFormat必须是 Go 标准格式字符串,不是 RFC3339
如何在中间件中注入 trace_id 并保持彩色控制台输出
彩色和结构化不互斥,关键在于:日志格式由 Formatter 控制,而字段由 logger.With().Str("trace_id", id).Logger() 注入。具体步骤:
- 在自定义 logger 中间件里,先生成唯一
reqID(如用uuid.NewString()) - 调用
c.Set("logger", logger.With().Str("trace_id", reqID).Logger()) - 后续 handler 中用
c.Get("logger")取出该实例,调用.Info().Msg("xxx")即可同时输出彩色文本 + trace_id 字段 - 注意:如果用了
ConsoleWriter,trace_id会作为普通字段显示在行末;若用JSONWriter,则自动成为 JSON key-value 对
tint.Handler 不适用于 Echo 默认 logger
别试图把 tint.NewHandler 塞进 Echo 的 logger 链路——它专为标准库 slog 设计,而 Echo v4.10+ 内置 logger 基于 zerolog,二者 Handler 接口不兼容。强行桥接需自己实现 zerolog.LevelWriter 包装 tint 输出,反而增加逃逸和锁开销。真要上 tint,建议弃用 Echo 自带 logger,改用 slog.With() + context.WithValue() 手动透传,更可控。










