Fiber 默认不支持按天切割日志,因其 fiber.Logger 底层依赖标准库 log.Logger,而后者仅接受 io.Writer 且无轮转能力;需用 lumberjack.Logger 作为 writer,并设 LocalTime: true、RotationTime: 24h 实现按天归档。

为什么 Fiber 默认不支持按天切割日志
Fiber 本身只提供 fiber.Logger 中间件,底层用的是标准库 log,而 log.Logger 没有内置轮转(rotation)能力——它只认一个 io.Writer,不管这个 writer 是文件、网络连接还是内存缓冲。直接往一个固定文件写,自然不会自动切分。
用 lumberjack 实现按天归档的正确姿势
最轻量、最常用的做法是把 lumberjack.Logger 当作 io.Writer 传给 fiber.Logger。注意:不是替换中间件,而是替换它的输出目标。
-
lumberjack的LocalTime: true必须设为true,否则按 UTC 时间切,和你服务器时区对不上 -
MaxAge: 7表示保留 7 天旧日志,但“按天切割”只由RotationTime: time.Hour * 24控制 - 不要设置
MaxSize(如 100
import (
"time"
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
)
<p>func main() {
app := fiber.New()</p><pre class="brush:php;toolbar:false;">// 配置 lumberjack 按天写入
logWriter := &lumberjack.Logger{
Filename: "./logs/access.log",
LocalTime: true,
RotationTime: 24 * time.Hour,
MaxAge: 7,
Compress: true,
}
app.Use(logger.New(logger.Config{
Output: logWriter, // ← 关键:把 lumberjack 实例塞进去
}))
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("hello")
})
app.Listen(":3000")
}
如果要用 logrus 或 zap,fiber.Logger 就得绕开
fiber.Logger 只接受 io.Writer,没法直接注入 logrus 的 Entry 或 zap 的 SugaredLogger。想用结构化日志又需要按天切割,就得自己实现中间件:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 用
c.Context().Request.Header和c.Response.StatusCode手动提取字段 - 把 logrus/zap 的 logger 实例绑定到
app.Use()里,而不是传给logger.New() - 确保你的 logrus hook(比如
lumberjack.Hook)也设置了LocalTime: true
简单起见,除非你已经在用 logrus/zap 做业务日志,否则别为了 access log 特意引入它们——lumberjack + fiber.Logger 组合足够干净。
常见踩坑点:文件权限、路径不存在、时区错位
启动时报 open ./logs/access.log: no such file or directory?不是 lumberjack 的 bug,是你没提前创建目录。
- 务必在
app.Listen()前执行os.MkdirAll("./logs", 0755) - Linux 下如果以非 root 用户运行,确认
./logs目录可写(chmod 755 logs) - 容器环境要注意挂载卷的用户 UID 是否匹配,否则
lumberjack创建新文件会失败 - 如果日志文件名变成
access.log.2024-05-22_03-00-00这种带小时分钟的,说明RotationTime设小了,或者LocalTime: false导致时区换算异常
按天切割这事,核心就三点:选对 writer(lumberjack)、关掉 size 切割、盯住时区和路径权限。其它包装都是干扰项。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










