我正在使用super -zap进行日志记录,我正在尝试以GELF格式记录到graylog。日志写入成功,但整个json被作为日志记录的message
键发送。
message: {"level":3,"timestamp":"2022-05-23T12:20:00.746+0430","caller":"log/log_zap.go:53","short_message":"Get Product Detail Error ","message":"product not found"}
但是我需要的是将字段写在分开的字段中,比如:
message: "product not found"
level:3
timestamp:"2022-05-23T12:20:00.746+0430"
caller:"log/log_zap.go:53"
short_message:"Get Product Detail Error "
这样我就可以在字段中搜索
这是我的代码:
writers = make([]io.Writer, 0, len(ws))
udpWriter, _ := gelf.NewUDPWriter(NewGraylogWriterConfig(cnf))
writers = append(writers, udpWriter)
var writeSyncers = make([]zapcore.WriteSyncer, len(writers))
for i, w := range writers {
writeSyncers[i] = zapcore.AddSync(w)
}
encoderConfig := uberzap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
enc := zapcore.NewJSONEncoder(encoderConfig)
core := zapcore.NewCore(enc, zapcore.NewMultiWriteSyncer(writeSyncers...), uberzap.InfoLevel)
sugar := uberzap.New(core, zap.AddCaller(), zap.AddCallerSkip(1)).Sugar()
sugar.Errorw(msg, FieldsToArray(fields)...)
我正在使用Graylog2/go- golf。V2为我的灰色日志作家。
我也试过NewConsoleEncoder
而不是NewJSONEncoder
。(也不工作)
任何帮助都是感激的。
事情是这样的,您的库提供了一种简单的方法来通过self发送消息,而无需额外注意消息字段,如"level"或"message".
zap logger是用"zap core"其中接口为主机,由3部分组成:
- Encoder -控制消息编码过程,即:JSON格式,控制台格式。 WriteSyncer -控制在哪里发送(写和同步)最终输出,即:stdout, sterr,一些UDP地址..
- LevelEnabler -控制应该记录的日志级别,即:debug, info.
self协议定义JSON消息,其中包含必需的字段及其类型。elf可以通过网络上的TCP/UDP发送(每种都有自己的优缺点)。从最后两句话我们可以推断出我们需要两件东西:
- 编码器我们的消息格式(与版本,主机,短消息…)。
你的库只提供"WriterSyncer"部分,但我们也必须干涉编码部分。如果你看一下你的库实现,你会发现它们只是获取你的msg(默认情况下可能是JSON格式),然后在"short/long_message"下发送。字段,而不按需要提取内部字段。
幸运的是,有人已经写了一个很好的,高度可配置的库为"gelf zap core";https://github.com/snovichkov/zap-gelf
祝你好运,开开心心!