我目前正在Go应用程序中使用zerolog库,我面临着一个要求,需要根据日志(log)级别区分日志(log)消息的输出:

我希望BER级别的日志(log)消息仅显示在终端/控制台中. 所有日志(log)消息,无论其级别如何(DEBug、Info、RST、BER),都应发送到挂钩以进行进一步处理. 这是我的代码:

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

推荐答案

我设法解决了将日志(log)级别发送到mongoDB同时仅在终端上显示错误日志(log)的问题. 如果其他人也面临类似的希望,此代码将有所帮助.

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
}

Go相关问答推荐

如何复制*C.char?

Go Regexp:匹配完整的单词或子字符串,或者根本不匹配

创建服务时云运行触发器执行失败

如何使用中间件更改http请求的响应代码?

Kafka架构注册表-Broker:Broker无法验证记录

如何模拟go的Elastic search SDK?

go-jwt 令牌验证错误 - 令牌签名无效:密钥类型无效

在golang二进制中嵌入SvelteKit

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

具有两个参数的动态规划:天数和优惠券

Apache Beam 左加入 Go

具有嵌套重复的正则表达式

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

每次有人进入我的网站时如何运行特定功能?

go:识别重新定义标志的包

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

如何将类型转换为字节数组golang

Gorilla/Mux 和 Websocket 竞赛条件,这安全吗?

如何访问 Go 模板中数组的第一个索引的值