前言
在之前的篇章中主要按照几个核心使用点进行源码的分析,有些细节未能覆盖到,因此对使用时可能需要注意的细节补充说明下。
输出日志信息内容的key具体顺序问题
先说结论,先后顺序为:
Level-Time-LoggerName-Caller-Message-已排序的InitialFields-fields->Stack
注意:以上部分信息可缺省,和具体的配置有关。
具体处理过程如下:
1.config build预处理部分信息
build中对InitialFields按照key排序处理,存入logger的core.enc.buf
func (cfg Config) Build(opts ...Option) (*Logger, error) {
...
log := New(
zapcore.NewCore(enc, sink, cfg.Level),
cfg.buildOptions(errSink)...,
)
...
return log, nil
}
func (cfg Config) buildOptions(errSink zapcore.WriteSyncer) []Option {
opts := []Option{
ErrorOutput(errSink)}
...
if len(cfg.InitialFields) > 0 {
fs := make([]Field, 0, len(cfg.InitialFields))
keys := make([]string, 0, len(cfg.InitialFields))
for k := range cfg.InitialFields {
keys = append(keys, k)
}
sort.Strings(keys)//按key排序
for _, k := range keys {
//根据已排序的key处理对应的val
fs = append(fs, Any(k, cfg.InitialFields[k]))
}
opts = append(opts, Fields(fs...))//添加fields的处理func
}
return opts
}
// Fields adds fields to the Logger.
//封装fields
func Fields(fs

最低0.47元/天 解锁文章
645

被折叠的 条评论
为什么被折叠?



