2

我一直在寻找有关如何实现数据库记录器的示例,以便uber-go.zipmessageandfields插入到数据库表中以进行查询。(所以没有编码)到目前为止没有运气找到一些例子,所以我从这里的例子开始:

如何访问 zap Hooks 中的字段?

但是代码甚至似乎没有做它建议它应该做的事情,这是我的例子:

https://go.dev/play/p/9AugEsYwA-E

package main

import (
    "errors"
    "fmt"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)

func main() {
    fmt.Println("Hello, 世界")
    l, _ := zap.NewProduction()
    logger := zap.New(&CqlLogCore{Core: l.Core()})

    logger.Info("some logging info",
        zap.Int("count", 17),
        zap.Error(errors.New("boom")))

}

type CqlLogCore struct {
    zapcore.Core
}

func (c *CqlLogCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
    fmt.Println("hi", entry, fields)
    return c.Core.Write(entry, fields)
}

带有“hi”的测试日志消息不会转储到标准输出。有人可以指出我哪里出错了,或者一个示例数据库记录器。

谢谢!

4

1 回答 1

-1

鉴于另一个答案中的修正,这就是我所在的位置。这是我目前对“正确”答案的理解。

我正在添加这个答案,但没有将其标记为正确,因为我仍在学习。这个答案旨在作为讨论的起点。谢谢。

package main

import (
    "errors"
    "fmt"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)

func main() {
    l, _ := zap.NewProduction()
    logger := zap.New(&CqlLogCore{Core: l.Core()})

    logger.Info("some logging info",
        zap.Int("count", 17),
        zap.Error(errors.New("boom")))

}

type CqlLogCore struct {
    zapcore.Core
}

func (c *CqlLogCore) Write(entry zapcore.Entry, fields []zapcore.Field) error {
    fmt.Println("hi  hi  ", entry, fields)
    return c.Core.Write(entry, fields)
}

func (c *CqlLogCore) Check(entry zapcore.Entry, checked *zapcore.CheckedEntry) *zapcore.CheckedEntry {
    if c.Enabled(entry.Level) {
        return checked.AddCore(entry, c)
    }
    return checked
}
于 2022-01-23T14:15:16.563 回答