fiber.logger() 不是为调试设计的日志组件,它默认仅记录非2xx状态码请求、不输出请求头/body/query、所有字段需手动配置格式字符串,且生产环境禁用。

fiber.Logger() 不是独立组件,它随 github.com/gofiber/fiber/v3 一起提供,无需额外安装。但直接调用它容易踩坑——它默认不打正常请求日志、不输出 body、还可能泄露敏感头,生产环境更不该用。
fiber.Logger() 默认行为为什么没日志?
- 它只记录 非 2xx 状态码 的请求(比如 404、500),
GET /返回 200 就完全静默 - 它跳过所有请求头、body、query 参数,连
${ip}和${path}都要手动写进格式字符串才显示 - 它不区分环境:开发想看全量流,生产却还在默默记 401,而你根本不知道
所以不是“没装好”,是它压根就不是为调试设计的。
怎么配出有用的日志格式?
必须显式传入格式字符串,且推荐只在开发环境启用:
app := fiber.New()
app.Use(fiber.Logger("[${time}] ${status} ${method} ${path} ${latency} ${bytesSent}"))
常见可用字段(全靠格式串触发):
-
${time}:当前时间(需格式化,如${time:2006-01-02 15:04:05}) -
${status}、${method}、${path}:基础信息 -
${latency}:耗时(单位 ns,可加:ms转毫秒) -
${bytesSent}:响应体字节数 -
${ip}:客户端 IP(注意:若前端有 Nginx,需配置X-Forwarded-For解析)
别写 ${headers} 或 ${body} —— fiber.Logger() 根本不支持,强行写只是原样输出字符串。
生产环境绝对不要用 fiber.Logger()
- 它会高频写磁盘,在树莓派或低 I/O 设备上直接拖垮服务,甚至触发 OOM
- 日志无结构、无级别、不兼容 systemd journal,没法做
journalctl -u myapp -p err这类过滤 - 它和
c.Locals共享上下文对象,跨请求写日志字段会导致数据污染
正确做法:
- 关掉它:
fiber.New(fiber.Config{DisableStartupMessage: true}) - 用
log.Printf()或zerolog输出到stderr,交由 systemd 或 Docker 拦截 - 错误日志走中间件捕获 panic 后主动打,而不是靠
fiber.Logger()被动等 500
真正难处理的是 fiber.Ctx 复用机制——你以为每次请求都新建一个上下文,其实它是从池里取的旧实例,c.Locals["req_id"] = uuid.New() 这种操作不加锁就会污染后续请求。











