生产环境不能全局 use(logger.new()),因其会导致日志爆炸、ansi颜色干扰解析、敏感路径泄露及耗时统计缺失;必须按路径分组启用、禁用颜色、跳过敏感接口。

直接用 logger.New() 会刷屏、漏打、甚至干扰监控——生产环境必须按路径分组启用,且禁用颜色和凭据敏感字段。
为什么不能全局 Use(logger.New())
全局注册会导致所有请求(包括 /favicon.ico、/health、静态资源)都被记录,日志量爆炸;CI/CD 日志管道无法解析 ANSI 颜色码,EnableColors: true(默认值)会让日志解析失败;更隐蔽的问题是:如果后续中间件(如 auth)提前返回错误,logger 的 “结束时间” 日志可能根本不会打印,造成耗时统计缺失。
- 只对
/api前缀启用:app.Use("/api", logger.New()) - 显式关闭颜色:
logger.New(logger.Config{EnableColors: false}) - 避免记录敏感头:
logger.New(logger.Config{SkipPaths: []string{"/login", "/token"}})
如何让日志包含请求 ID 和用户信息
Fiber v3 已废弃 c.Locals("requestid") 这类字符串键访问方式。如果你用了 requestid.New() 中间件,必须改用 requestid.FromContext(c.Context()) 获取值;同理,session、basicauth 等中间件也需用各自导出的 FromContext 函数。
- 在 logger 配置中注入自定义字段:
CustomTags: map[string]logger.Tag{"reqid": func(c *fiber.Ctx) interface{} { return requestid.FromContext(c.Context()) }} - 若已存用户 ID 到 context(比如 token 校验中间件里调了
c.Locals("uid", uid)),可用相同方式提取:"uid": func(c *fiber.Ctx) interface{} { return c.Locals("uid") } - 注意:v3 中
c.Locals仅对开发者手动写入有效,框架中间件不再往里塞数据
怎么把日志同时输出到文件和控制台
Fiber 的 logger 中间件本身不支持多输出目标,它只写到 io.Writer。你需要自己封装一个双写器(io.MultiWriter),并确保文件按天轮转——别用中间件内置的 Output 直接指文件,否则重启服务会覆盖旧日志。
- 创建带日期的文件句柄:
file, _ := os.OpenFile("logs/"+time.Now().Format("2006-01-02")+".log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - 组合输出目标:
mw := io.MultiWriter(os.Stdout, file) - 传给 logger:
logger.New(logger.Config{Output: mw}) - ⚠️ 文件句柄需在进程生命周期内复用,不要每次请求都
OpenFile,否则 fd 耗尽
最易被忽略的是:日志中间件必须放在 auth、recover 等中间件之前,否则 panic 或未授权请求的完整链路日志就断了;另外,logger 不捕获业务 handler 内部的 fmt.Print 或 SQL 日志,那些得单独配 ORM 或自定义 log 包处理。











