gpt4 book ai didi

go - Zap 记录器打印到控制台和日志文件

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:40 26 4
gpt4 key购买 nike

我已将 Zap 与我的 go 应用程序集成,我们将日志打印在两个日志文件中,我还使用 Lumberjack 进行日志轮换。但我也试图在控制台中显示日志,但这种情况下运气不好。以下是我在 logger.go 中的代码

var (
Logger *zap.Logger
N2n *zap.Logger
)

type WriteSyncer struct {
io.Writer
}

func (ws WriteSyncer) Sync() error {
return nil
}

func InitLogging(mode string) {
var cfg zap.Config
var logName = "abc.log"
var slogName = "n2n.log"

if mode == "production" {
cfg = zap.NewProductionConfig()
cfg.DisableCaller = true
} else {
cfg = zap.NewDevelopmentConfig()
cfg.EncoderConfig.LevelKey = "level"
cfg.EncoderConfig.NameKey = "name"
cfg.EncoderConfig.MessageKey = "msg"
cfg.EncoderConfig.CallerKey = "caller"
cfg.EncoderConfig.StacktraceKey = "stacktrace"
}

cfg.Encoding = "json"
cfg.EncoderConfig.TimeKey = "timestamp"
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
cfg.OutputPaths = []string{logName}
sw := getWriteSyncer(logName)
swSugar := getWriteSyncer(slogName)

l, err := cfg.Build(SetOutput(sw, cfg))
if err != nil {
panic(err)
}
defer l.Sync()

ls, err := cfg.Build(SetOutput(swSugar, cfg))
if err != nil {
panic(err)
}
defer ls.Sync()

Logger = l
N2n = ls
}

// SetOutput replaces existing Core with new, that writes to passed WriteSyncer.
func SetOutput(ws zapcore.WriteSyncer, conf zap.Config) zap.Option {
var enc zapcore.Encoder
switch conf.Encoding {
case "json":
enc = zapcore.NewJSONEncoder(conf.EncoderConfig)
case "console":
enc = zapcore.NewConsoleEncoder(conf.EncoderConfig)
default:
panic("unknown encoding")
}

return zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewCore(enc, ws, conf.Level)
})
}

func getWriteSyncer(logName string) zapcore.WriteSyncer {
var ioWriter = &lumberjack.Logger{
Filename: logName,
MaxSize: 10, // MB
MaxBackups: 3, // number of backups
MaxAge: 28, //days
LocalTime: true,
Compress: false, // disabled by default
}
var sw = WriteSyncer{
ioWriter,
}
return sw
}

我已尝试附加输出路径,但它不起作用。

最佳答案

由于这是在 Google 上查找后首先出现的内容之一,这里有一个简单的示例,说明如何在控制台和日志文件上显示日志,日志文件可以是任何 io.Writer,如伐木 worker :

func logInit(d bool, f *os.File) *zap.SugaredLogger {

pe := zap.NewProductionEncoderConfig()

fileEncoder := zapcore.NewJSONEncoder(pe)

pe.EncodeTime = zapcore.ISO8601TimeEncoder # The encoder can be customized for each output
consoleEncoder := zapcore.NewConsoleEncoder(pe)

level := zap.InfoLevel
if d {
level = zap.DebugLevel
}

core := zapcore.NewTee(
zapcore.NewCore(fileEncoder, zapcore.AddSync(f), level),
zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), level),
)

l := zap.New(core) # Creating the logger

return l.Sugar()
}

我使用了默认的 ProductionEncoderConfig,但它可以是自定义的,例如 OP 代码中的那个。

关于go - Zap 记录器打印到控制台和日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50933936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com