Fiber 官方 logger 中间件不支持 Spring Boot 风格的 pattern 配置,因其底层基于 fmt.Fprintf 和固定模板,仅接受 Go 的 %s/%d/%v 格式符,且 Format 字符串中无法动态执行 time.Now() 或注入 PID、应用名等变量;需用 NewWithConfig + 函数式 Format 手动拼接时间戳和 PID。

Fiber 框架本身不内置 Logger 中间件,所谓 “Logger 中间件” 实际是 fiber.Handler 类型的函数,需手动构造或使用社区封装(如 fiber/middleware/logger),且默认输出格式固定、不可直接用 Spring Boot 那套 logging.pattern.console 风格配置。
为什么 Fiber 的 logger 中间件不能直接填 pattern 字符串
Fiber 的官方 logger 中间件(fiber/middleware/logger)底层用的是 fmt.Fprintf + 固定模板,不是 Logback 那类支持占位符解析的日志引擎。它只提供几个预设字段开关(如是否打印状态码、延迟、路径),不支持自定义时间格式、PID、应用名插入或字段顺序重排。
常见错误现象:
• 在配置里写 logger.Config{Format: "%d{HH:mm:ss} %status..."} → 无效果,日志原样输出该字符串
• 试图复用 Spring Boot 的 %-5level 或 ${spring.application.name} → 编译报错或运行时 panic
- 它接受的
Format是 Go 的fmt风格动词(%s,%d,%v),不是 Logback 的 pattern 占位符 - 可用字段仅限中间件内部暴露的
fiber.Ctx属性,比如c.Status(),c.Method(),c.Path(),没有PID或application.name这种上下文变量 - 若需 PID 或服务名,必须自己从
os.Getpid()或环境变量读取,并拼进 Format 字符串
怎么用 fiber/middleware/logger 输出带时间戳和 PID 的日志
要让每条日志开头带 ISO 时间 + 当前进程 PID,得绕过默认模板,用 logger.Config{Format: ...} 手动拼接。注意:Go 的 time.Now().Format(...) 不能直接写在 Format 字符串里,必须提前计算好再传入 —— 所以实际要用 logger.NewWithConfig + 自定义 Format 函数。
实操建议:
- 不要用
logger.New()(它用默认模板,无法改格式) - 改用
logger.NewWithConfig(logger.Config{Format: "..."} ),其中Format是一个字符串,内含%v占位符,对应fiber.Ctx字段值 - PID 需提前获取:
pid := strconv.Itoa(os.Getpid()),然后在 Format 字符串里硬编码进去(因为中间件不支持动态注入) - 时间戳必须用
time.Now().Format("2006-01-02 15:04:05.000")格式化后作为字符串常量拼入,不能写成%d{...}
示例(application startup 阶段):
pid := strconv.Itoa(os.Getpid())
app.Use(logger.NewWithConfig(logger.Config{
Format: "[" + time.Now().Format("2006-01-02 15:04:05.000") + "] " + pid + " ${ip} ${method} ${path} ${status} ${latency}\n",
}))
⚠️ 注意:${ip} 等是 Fiber logger 支持的特殊变量(非 Go 模板),但 time.Now() 只能执行一次 —— 所以上面写法会导致所有日志都显示启动时刻的时间。真正可用的方案是:用 Format 接收函数,而非字符串:
app.Use(logger.NewWithConfig(logger.Config{
Format: func(c *fiber.Ctx) string {
return fmt.Sprintf("[%s] %s %s %s %d %s\n",
time.Now().Format("2006-01-02 15:04:05.000"),
pid,
c.IP(),
c.Method(),
c.Response().StatusCode(),
c.Path(),
)
},
}))
想加颜色、对齐、应用名?得换方案
Fiber 官方 logger 不支持 ANSI 颜色、字段宽度控制(如 %-5level)、也不读取配置文件里的 spring.application.name —— 因为它根本不知道 Spring 是什么。如果你真需要类似 Spring Boot 那种可配置、带颜色、字段对齐、支持服务名注入的日志格式,有两条路:
- 放弃
fiber/middleware/logger,直接用log/slog(Go 1.21+)或zerolog+fiber.Next()手写中间件:在ctx.Next()前后手动记录,完全掌控格式 - 用第三方封装,比如
github.com/gofiber/fiber/v2/middleware/logger的 fork 版本,或社区项目fiber-logger-zap(基于 zap),但这类库通常需额外引入、自行维护 - 关键限制:Fiber 的中间件生命周期短,不维护全局 context,所以“应用名”必须从
os.Getenv("APP_NAME")或启动参数传入,不能像 Spring Boot 那样自动绑定配置项
最容易被忽略的一点:Fiber 的 logger 中间件默认不捕获 panic 日志,也不输出错误堆栈 —— 如果你依赖它做问题排查,记得额外加 recover 中间件,或把 error 日志交给 slog.Error 统一处理。


















