You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zerolog Logger无法在日志中展示error字段的技术求助

问题分析与解决方案

你的zerolog日志中缺失error字段,主要有以下几种可能原因及对应解决办法:

1. 原始错误err为nil

你使用了errors.Wrap(err, "bad request"),如果传入的err本身是nil,那么errors.Wrap会返回nil。此时调用Err(nil),zerolog不会添加任何error字段到日志中。

解决办法:
在调用errors.Wrap前先检查err是否为nil,确保传入有效的错误对象:

if err != nil {
    l.Warn().
        Str("requestID", reqIDRaw).
        Str("method", r.Method).
        Str("url", r.URL.Path).
        Err(errors.Wrap(err, "bad request")).
        Msg("bad request")
}

2. ConsoleWriter未配置显示error字段

从你的日志输出格式判断,output大概率是zerolog.ConsoleWriter。默认情况下它不会以error=xxx的键值对形式展示错误,若错误内容未正常显示,需自定义ConsoleWriter的字段映射或格式化逻辑。

解决办法:
配置ConsoleWriter的FieldMap明确指定error字段的显示方式,或自定义格式化函数:

output := zerolog.ConsoleWriter{
    Out: os.Stdout,
    FieldMap: map[string]string{
        zerolog.ErrorFieldName: "error",
    },
    // 可选:自定义字段格式化规则,确保错误字段正常输出
    FormatField: func(i interface{}) string {
        return fmt.Sprintf("=%v", i)
    },
}

// 重新创建logger
log = zerolog.New(output).
            Level(zerolog.Level(logLevel)).
            With().
            Stack().
            Caller().
            Timestamp().
            Str("git_revision", gitRevision).
            Str("go_version", buildInfo.GoVersion).
            Logger()

3. 验证zerolog版本兼容性

若使用的是较旧版本的zerolog,可能存在Err方法的行为差异。建议升级到最新稳定版本:

go get -u github.com/rs/zerolog@latest

快速验证方法

你可以先直接传入一个非nil错误测试,确认error字段是否能正常输出:

l.Warn().
    Err(errors.New("test error")).
    Msg("test message")

如果这条日志能显示error字段,说明之前的问题出在原始err为nil;若仍不显示,再重点检查ConsoleWriter的配置。

内容的提问来源于stack exchange,提问作者KengoWada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:02:42