fiber默认logger中间件仅输出简单调试日志,不包含ip、method等字段;生产环境需自定义中间件或第三方日志库(如zerolog),注意结构化输出、敏感信息脱敏、采样及性能优化。

Logger中间件默认不记录访问日志,得自己拼接
Fiber 的 fiber.Logger() 中间件只输出简单格式(如时间 + 状态码 + 耗时),不包含 IP、Method、Path、User-Agent 这些常见访问日志字段。它本质是调试用的,不是生产级访问日志方案。
如果你要记录类似 Nginx 那样的标准访问日志(比如 127.0.0.1 - GET /api/users 200 123ms "Mozilla/..."),得手动构造日志行,或改用更灵活的日志中间件。
用 fiber.New() 自定义 Logger 中间件最可控
绕过 fiber.Logger(),直接用 app.Use() 注册一个自定义中间件,能自由读取 c.IP()、c.Method()、c.Path()、c.Get("User-Agent") 等字段,并控制输出时机(比如只在响应后写日志)。
- 必须在
c.Next()之后读取c.Response().StatusCode和耗时,否则拿不到最终状态 - 用
time.Now()记开始时间,再用time.Since()算耗时,别依赖中间件内置计时器 - 注意
c.IP()可能被代理污染,需配合app.Config().ProxyHeader或c.Context().RealIP()(需配置可信代理) - 日志建议走结构化输出(如 JSON),方便后续采集;纯文本注意字段顺序和转义,尤其
Path和User-Agent可能含空格或引号
app.Use(func(c *fiber.Ctx) error {
start := time.Now()
err := c.Next()
status := c.Response().StatusCode()
duration := time.Since(start).Milliseconds()
log.Printf("%s - %s %s %d %.0fms %q",
c.IP(),
c.Method(),
c.Path(),
status,
duration,
c.Get("User-Agent"),
)
return err
})
用第三方日志库(如 zerolog)替代 fmt.Printf
直接 log.Printf 或 fmt.Println 不适合生产:没分级、没上下文、难过滤、不支持异步写入。推荐接入 zerolog 或 logrus,它们能自动注入请求 ID、结构化字段、输出到文件或 stdout。
-
zerolog更轻量,原生支持context.Context,推荐搭配fiber.Ctx.Locals注入 traceID - 避免在中间件里新建 logger 实例,应复用全局 logger,否则可能丢失 Hook 或 Writer 配置
- 如果用了
fiber.New()的Config.ErrorHandler,也要确保错误日志走同一 logger,保持格式统一
别忽略日志性能和敏感信息
高频接口下,字符串拼接 + I/O 是瓶颈。每条日志都做 c.Get("User-Agent") 或 c.IP() 也会增加开销;更麻烦的是,Path 或查询参数里可能带 token、手机号等敏感数据,直接打日志等于泄露。
- 对
POST /login、GET /user?token=xxx这类路径,建议白名单匹配后脱敏,例如用正则替换token=[^&]*为token=*** - 考虑加采样,比如只记录 5% 的请求,或只记错误(
status >= 400)和慢请求(duration > 500) - 不要把
c.Body()全打出来——体积大、含敏感字段、还可能破坏日志格式
真正上线时,访问日志的字段取舍、脱敏规则、输出目标(文件轮转?syslog?Loki?)比“怎么启用中间件”重要得多。先想清楚你要查什么问题,再决定记什么、怎么记。











