跳转到内容

日志

go-zero 的 logx 包提供结构化、分级、零分配 JSON 日志,并自动关联 trace 信息。

import "github.com/zeromicro/go-zero/core/logx"
logx.Info("服务已启动")
logx.Infof("监听端口 %d", port)
logx.Infow("订单已创建",
logx.Field("orderId", id),
logx.Field("userId", userId),
logx.Field("amount", amount),
)
logx.Errorw("数据库错误", logx.Field("err", err), logx.Field("query", sql))
logx.Debug("详细调试信息") // 默认不输出,Level 设为 "debug" 时生效
logx.Info("正常运行信息")
logx.Slow("查询耗时 200ms") // 用于慢操作阈值告警
logx.Error("发生错误")
logx.Severe("严重故障") // 同时写入 stderr

级别由低到高:debug < info < slow < error < severe

etc/app.yaml
Log:
ServiceName: order-api
Mode: file # "console" | "file" | "volume"
Path: /var/log/order-api
Level: info # "debug" | "info" | "error"
Encoding: json # "json" | "plain"
Compress: true # 对已轮转的日志文件进行 gzip 压缩
KeepDays: 7 # 删除 N 天之前的日志文件
StackCooldownMillis: 100
模式行为
console写入 stdout,适合容器和本地开发
file写入 <Path>/<ServiceName>.log,按天轮转
volume写入挂载卷(行为同 file

使用 logx.WithContext 自动附加当前的 trace ID 和 span ID:

func (l *OrderLogic) CreateOrder(req *types.OrderReq) (*types.OrderResp, error) {
// l.Logger 已预绑定到 l.ctx
l.Logger.Infow("正在创建订单",
logx.Field("userId", req.UserId),
logx.Field("amount", req.Amount),
)
// 输出:{"level":"info","trace_id":"4bf92...","span_id":"00f06...","userId":42,"amount":100}
return nil, nil
}

在 logic 结构体之外使用:

logger := logx.WithContext(ctx)
logger.Infow("事件", logx.Field("key", value))

高吞吐服务每秒产生大量日志。可通过代码控制采样:

logx.SetLevel(logx.InfoLevel)
logx.DisableStat() // 关闭周期性 CPU/内存统计日志

将日志路由到任意 io.Writer——适合接入 Sentry、Loki 或日志聚合系统:

logx.SetWriter(logx.NewWriter(myWriter))

多目标输出(扇出):

type teeWriter struct {
a, b io.Writer
}
func (t *teeWriter) Write(p []byte) (int, error) {
t.a.Write(p)
return t.b.Write(p)
}
logx.SetWriter(logx.NewWriter(&teeWriter{os.Stdout, sentryWriter}))

在单元测试中屏蔽所有日志输出:

func TestMain(m *testing.M) {
logx.Disable()
os.Exit(m.Run())
}
场景写法
错误(带堆栈)logx.Field("err", err)
耗时logx.Field("latency", time.Since(start))
切片logx.Field("ids", ids)
嵌套结构体logx.Field("req", req)(自动序列化为 JSON)

超过 Timeout 的请求会被 go-zero 自动以 slow 级别记录——无需额外代码:

Timeout: 3000 # 超过 3 秒的请求自动进入慢日志