Go语言 带有gelf驱动程序的UberZap将整个日志写入消息字段

xqkwcwgp  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(73)

我正在使用uber-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-gelf.v2作为我的graylog writer。
我也试过NewConsoleEncoder而不是NewJSONEncoder。(也不工作)
任何帮助都是感激不尽的。

yshpjwxd

yshpjwxd1#

事情是这样的,你的库提供了一种通过gelf发送消息的简单方法,而不需要额外关注消息字段,比如“level”或“message”。
zap logger是用“zap core”接口构建的,它是主引擎,由3个组件组成:
1.编码器-控制消息编码过程,即:转换为JSON格式、控制台格式..

  1. WriteSyncer -控制向何处发送(写入和同步)最终输出,即:stdout,sterr,some UDP address..
  2. LevelEnabler -控制应记录的日志级别,即:debug,info..
    gelf协议定义了JSON消息,其中包含所需的字段及其类型。gelf可以通过TCP / UDP在网络上发送(每一个都有自己的优点和缺点)。从最后两句话中我们可以推断出我们需要两件事:
    1.encoder我们的消息到gelf格式(与版本,主机,短消息..)。
    1.到某个TCP / UDP地址。
    您的库只提供“WriterSyncer”部分,但我们也必须干预编码部分。如果你看一下你的库实现,你会发现他们只是得到了你的msg(默认情况下可能是JSON格式),并在“short/long_message”字段下发送它,而没有提取你想要的内部字段。
    幸运的是,有人已经为“gelf zap core”https://github.com/snovichkov/zap-gelf编写了一个很好的、高度可配置的库
    祝你好运,快乐gelfing!

相关问题