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
相关产品推荐
相关产品推荐

