区分终端中的错误级别日志输出并挂钩 Zerolog go

问题描述 投票:0回答:1

我目前正在 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,使错误级别的日志消息仅显示在终端中,同时仍然允许将所有日志消息发送到挂钩以进行进一步处理?

go zerolog
1个回答
0
投票

我设法解决了将日志级别发送到 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
}
© www.soinside.com 2019 - 2024. All rights reserved.