日志 g.Log:级别、文件滚动与 ctx 首参约定
结论:日志统一走 g.Log()(默认单例 Logger);约定“ctx 作为第一参数”以便自动携带 traceId 做全链路检索;文件输出支持按日期命名、按大小滚动、保留份数与过期清理。
一、核心要点
- 级别:DEBUG、INFO、NOTICE、WARN、ERROR、CRITICAL,通过 SetLevel 或配置文件控制输出下限。
- 分类:g.Log("pay") 创建独立 Logger,可单独设置路径、文件与级别。
- ctx 首参约定:g.Log().Info(ctx, ...),框架从 ctx 提取链路信息(traceId 等);传 nil/空 ctx 则无链路字段。
- 默认输出到 stdout;配置 path 后可同时写文件。
二、文件滚动相关方法
| 方法 | 作用 |
|---|---|
| SetPath(dir) | 设置日志目录 |
| SetFile("app-{Y-m-d}.log") | 文件名模板,支持日期变量按天分文件 |
| SetRotateSize(size) | 按大小滚动 |
| SetRotateBackupLimit(n) | 保留最近 N 份滚动文件 |
| SetRotateBackupExpire(d) | 过期文件自动清理 |
代码示例
// 编程式配置
g.Log().SetPath("/data/log/app")
g.Log().SetFile("app-{Y-m-d}.log")
g.Log().SetRotateSize(100 * 1024 * 1024)
// 业务日志:ctx 永远第一个参数
g.Log().Info(ctx, "用户登录", g.Map{"uid": 1})
g.Log().Error(ctx, err)
// 分类日志
g.Log("pay").SetFile("pay-{Y-m-d}.log")
g.Log("pay").Error(ctx, "支付回调失败", g.Map{"order": "123"})
配置文件方式:
logger:
path: "./log"
level: "info"
file: "{Y-m-d}.log"
常见追问 / 记忆点
- 追问:为什么要 ctx 首参?→ 日志组件从 ctx 提取 traceId/span 等信息,输出统一字段,支撑跨服务全链路排障。
- 追问:ERROR 怎么记最有效?→ 带 error 对象与关键业务上下文(订单号、uid 等),不要只记一句话。
- 记忆点:ctx 永远第一参数;文件滚动“日期分文件 + 大小滚动 + 数量/过期双上限”;生产级别不低于 info。