当我的代码中有 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/