我目前正在 Go 应用程序中使用 Zerolog 库,我面临一个要求,需要根据日志级别区分日志消息的输出:
我希望错误级别的日志消息仅显示在终端/控制台中。 所有日志消息,无论其级别如何(DEBUG、INFO、WARNING、ERROR),都应发送到挂钩以进行进一步处理。 这是我的代码:
func InitLogger(ctx context.Context, cfg *config, mc *mongo.Client) *zerolog.Logger {
once.Do(func() {
var multi zerolog.LevelWriter
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: true, TimeFormat: time.RFC3339}
multi = zerolog.MultiLevelWriter(consoleWriter)
logger := zerolog.New(multi).Level(zerolog.TraceLevel).With().Timestamp().Logger()
logger = logger.Hook(&ZerologHook{
mClient: mc,
})
zLog = &logger
})
return zLog
}
type ZerologHook struct {
mClient *mongo.Client
}
func (zh *ZerologHook) Run(e *zerolog.Event, level zerolog.Level, message string) {
wg.Add(1)
go func() {
logData := LogData{}
_ = zh.sendLogToMongoDB(e.GetCtx(), message, logData)
wg.Done()
}()
}
有没有办法配置 Zerolog,使错误级别的日志消息仅显示在终端中,同时仍然允许将所有日志消息发送到挂钩以进行进一步处理?
我设法解决了将日志级别发送到 mongoDB 而仅在终端上显示错误日志时遇到的问题。 如果其他人也面临类似的希望,此代码将会有所帮助。
func ConsoleWriter() zerolog.ConsoleWriter {
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: true, TimeFormat: time.RFC3339}
return consoleWriter
}
func InitLogger(ctx context.Context, mc *mongo.Client, productType int) *zerolog.Logger {
once.Do(func() {
var multi zerolog.LevelWriter
multi = zerolog.MultiLevelWriter(ZerologOut{
mClient: mc,
})
logger := zerolog.New(multi).With().Timestamp().Logger()
zLog = &logger
})
return zLog
}
type ZerologOut struct {
mClient *mongo.Client
}
func (zo ZerologOut) Write(p []byte) (n int, err error) {
return os.Stdout.Write(p)
}
func (zo ZerologOut) WriteLevel(level zerolog.Level, p []byte) (n int, err error) {
message := string(p)
logData := LogData{}
err = zo.sendLogToMongoDB(context.Background(), message, logData)
if err != nil {
return 0, err
}
if level == zerolog.ErrorLevel {
return ConsoleWriter().Write(p)
}
return len(p), nil
}