日志 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。
笔记加载中…