go - Zerolog 中的 Hook 未注册

标签 go logging hook alert zerolog

当我的代码中有 level > 警告时,我试图遵循触发 Hook 。我看到了错误日志本身,但之后我没有看到打印语句。

我正在关注以下示例:https://betterstack.com/community/guides/logging/zerolog/ 并在堆栈溢出流上看到了这个引用: Why is this zerolog hook an ineffective assignment?

这是我的代码。

type AlertHook struct{}

func (t *AlertHook) Run(e *zerolog.Event, level zerolog.Level, message string) {
    if level > zerolog.WarnLevel {
        _ = alert(message)
    }
}

func alert(msg string) error {
    fmt.Println(msg)

    return nil
}

var once sync.Once

var log zerolog.Logger

func Get() zerolog.Logger {
    once.Do(func() {
        zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
        zerolog.TimeFieldFormat = time.RFC3339Nano

        logLevel, err := strconv.Atoi(os.Getenv("LOG_LEVEL"))
        if err != nil {
            logLevel = int(zerolog.InfoLevel) // default to INFO
        }

        var output io.Writer = zerolog.ConsoleWriter{
            Out:        os.Stdout,
            TimeFormat: time.RFC3339,
        }

        if os.Getenv("APP_ENV") != "development" {
            fileLogger := &lumberjack.Logger{
                Filename:   "service.log",
                MaxSize:    5,
                MaxBackups: 10,
                MaxAge:     14,
                Compress:   true,
            }

            output = zerolog.MultiLevelWriter(os.Stderr, fileLogger)
        }

        var gitRevision string

        buildInfo, ok := debug.ReadBuildInfo()
        if ok {
            for _, v := range buildInfo.Settings {
                if v.Key == "vcs.revision" {
                    gitRevision = v.Value
                    break
                }
            }
        }

        log = zerolog.New(output).
            Level(zerolog.Level(logLevel)).
            With().
            Timestamp().
            Str("git_revision", gitRevision).
            Str("go_version", buildInfo.GoVersion).
            Logger()

    })
    log.Hook(&AlertHook{})
    return log
}

然后在我的处理程序中我只是想测试

// CreateClientHandler is the handler for creating a new client.
// It is used to create a new client.
func CreateClientHandler(si *server.ServerInstance) fiber.Handler {
    return func(c *fiber.Ctx) error {
        l := logs.Get()
        l.Error().Msg("test error") //  SHOULD TRIGGER HOOK
        o := new(models.APIClientUser)

        if err := c.BodyParser(o); err != nil {
            return c.Status(fiber.StatusBadRequest).JSON(models.NewErrorBadRequest(&err))
        }

        result := si.DB.ORM.Create(&o)
        if result.Error != nil {
            return c.Status(fiber.StatusBadRequest).JSON(models.NewErrorBadRequest(&result.Error))
        }

        return c.Status(fiber.StatusCreated).JSON(models.NewSuccessCreated(o))
    }
}

最佳答案

我能够解决这个问题

...
        log = log.Hook(&AlertHook{})
    })
    return log

关于go - Zerolog 中的 Hook 未注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77299338/

相关文章:

svn - 我可以从本地副本中检索SVN日志吗?

git - 在 git push 上硬重置

c++ - 使用 C++ Hook QT 应用程序以捕获应用程序的文本名称

azure - 应用程序登录到 Azure Blob 存储或使用 log4net 进入 SQL

javascript - 如何在 postgres plv8 过程中记录字符串?

hook - Drupal 8 模块开发 : hook_node_access not called

go - 在 Go 中扫描向上和向下箭头?

go - 如何漂亮地打印字节数组和字符数组?

c - 如何在没有定义 main() 的情况下让 cgo 构建目标文件?

go - Cobra 更改帮助模板中的用法行