Go语言 如何向ZAP日志条目添加新的列/字段?

iq0todco  于 2023-04-09  发布在  Go
关注(0)|答案(2)|浏览(163)

我有以下日志结构:

[STDERR] 2018-07-09 11:06:16.003    INFO    some_pkg/main.go:232    Logging message 1   {"pid": 8842, "process": "some_process"}
[STDERR] 2018-07-09 11:06:16.006    DEBUG   some_pkg/main.go:291    Logging message 2   {"pid": 8842, "process": "other_process"}
[STDERR] 2018-07-09 11:06:16.009    INFO    some_pkg/main.go:345    Logging message 3   {"pid": 8842, "process": "some_process"}

在这个日志片段中可以看到五种类型的信息。消息和JSON字段(除了[STDERR]字段)。这意味着我在我的日志结构中有五列。我想添加一个新的列与关键 pid 和 * 进程 *我应该如何使用ZAP编码器和配置来实现这一点?我在ZAP文档中没有找到解决方案。
我使用以下代码向日志添加字段:
logger = logger.With(zap.Field{Key: "pid", Type: zapcore.Int64Type, Integer: int64(os.Getpid())})
但是pid字段的值会转到JSON(你可以在上面看到),我想在新的列中看到它。
我想要的结构将与前面的例子如下:

[STDERR] 2018-07-09 11:06:16.003    INFO    some_pkg/main.go:232    Logging message 1   8842    some_process
[STDERR] 2018-07-09 11:06:16.006    DEBUG   some_pkg/main.go:291    Logging message 2   8836    other_process
[STDERR] 2018-07-09 11:06:16.009    INFO    some_pkg/main.go:345    Logging message 3   8842    some_process
juzqafwq

juzqafwq1#

没有一个很好的方法来做到这一点。这个答案提供了一个解释,一个非解决方案和一个黑客。

说明

首先,让我澄清一下术语:你说的日志“列”是zapcore.Entry的字段,即日志条目。列之间的间距由zapcore.EncoderConfig的字段ConsoleSeparator给出,默认为\t
日志条目的格式化发生在consoleEncoder类型的EncodeEntry方法中,但您无法自定义其行为:zapcore.Entry是一个结构体,在该实现中没有钩子可以用来改变记录字段的内容和时间。

非解

剩下的第一个选择是实现自己的编码器并使用它来构造zapcore.Core

enc := &customEncoder{} 
logger := zap.New(zapcore.NewCore(enc, os.Stderr, zap.NewAtomicLevelAt(zap.DebugLevel)))

自定义编码器必须实现zapcore.Encoder。这会带来很多问题,例如日志条目字段的顺序、堆栈跟踪的可能存在、编码器的配置选项、代码重用等。不值得深入研究所有细节;我只想说,在这个用例中实现zapcore.Encoder将是非常尴尬的,而且可能不值得维护。

黑客

默认控制台编码器打印的zapcore.Entry的最后一个字段是Message。所以你可以做的是预先格式化消息:

pid := 8842
procname := "some_process"

msg := fmt.Sprintf("Logging message 1\t%d\t%s", pid, procname)
logger.Info(msg)

将打印:
[STDERR] 2018-07-09 11:06:16.003 INFO some_pkg/main.go:232日志消息1 8842 some_process

bf1o4zei

bf1o4zei2#

所请求的日志记录样式将导致结构化日志记录(JSON)和非结构化日志记录(控制台中的所有其他字段)的混合。
blackgreen的答案应该使之成为可能,这是一个很好的黑客,但我认为这里更大的问题是你正在反对zap所提供的(在Go中快速,结构化,分级登录)。
推荐的方法是将所有内容都放在json中,并在您使用的任何日志查看器中解析json键。生成的日志结构如下所示:

{"timeStamp": "2018-07-09 11:06:16.003", "level": "INFO", "source": "some_pkg/main.go:232", "msg": "Logging message 1", "pid": 8842, "process": "some_process"}

相关问题