必须替换默认logger实例并设置formatter字段才能自定义日志格式;直接修改e.logger.formatter会panic;需用zerolog.consolewriter或jsonwriter等实现formatter接口,并注入上下文字段以支持trace_id等业务信息。

要在Echo框架中自定义Logger中间件的日志格式,必须替换默认的echo.Logger实例,并通过设置Formatter字段控制输出结构,否则日志始终为固定JSON或默认文本格式。
替换默认Logger中间件
创建新Logger实例,调用echo.NewLogger()并传入自定义配置,再用e.Use()注册该实例,而不是直接使用e.Logger(它不可写)。
这一步不能跳过:Echo启动后默认Logger是只读的,【直接修改e.Logger.Formatter会导致panic】。
设置自定义Formatter
给Logger实例的Formatter字段赋值为自定义的zerolog.ConsoleWriter或zerolog.JSONWriter,其中ConsoleWriter适合开发环境,JSONWriter适合日志采集系统。
注意:Echo v4.10+ 内置logger基于zerolog,所以Formatter类型必须是zerolog.Formatter接口实现,传入*bytes.Buffer或os.Stdout均可,但必须显式指定TimeFormat、NoColor等字段才能生效。
编写结构化日志格式函数
方法一:使用ConsoleWriter输出带颜色、时间、状态码的可读格式
初始化zerolog.ConsoleWriter → 设置TimeFormat = "2006-01-02 15:04:05" → 设置NoColor = true(生产环境禁用颜色)→ 将其赋给logger.Formatter。
方法二:使用JSONWriter输出标准结构化字段
Echo框架 5.1.0 版本源码包下载,适合关注 RealIP 行为变化、StartConfig.Listener、NewDefaultFS 和观测性中间件入口的开发团队。
创建JSONWriter → 调用w.SetIndent("", " ")增强可读性 → 启用w.TimeFieldFormat = zerolog.TimeFormatUnixMicro → 最后赋值给logger.Formatter。
方法三:完全自定义格式——实现zerolog.Formatter接口
定义type MyFormatter struct{} → 实现Format()方法,手动拼接req.Method + " " + req.URL.Path + " " + strconv.Itoa(res.Status()) + " " + fmt.Sprintf("%.3f", elapsed.Seconds()) → 这种方式绕过zerolog内置字段映射,但需自行处理并发安全与字段逃逸。
注入请求上下文字段
第一步:在Logger中间件中调用c.Get("logger")获取已绑定的zerolog.Logger实例。
第二步:用logger.With().Str("path", c.Request().URL.Path).Str("method", c.Request().Method).Uint32("id", reqID).Logger()生成新实例。
第三步:将该实例存入c.Set("logger", newLogger),后续handler中即可用c.Get("logger")取出使用。
这一步决定了日志里能否出现trace_id、user_id等业务字段——如果不做,所有日志都只有基础HTTP信息。










