I am trying to follow to trigger a hook when there is an level > warning in my code. I see the error log itself, But I am not seeing the print statement after that.
I was following the following sample: https://betterstack.com/community/guides/logging/zerolog/ and saw this reference on stack over flow: Why is this zerolog hook an ineffective assignment?
Here is my code.
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
}
then in my handler I am just trying to test
// 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))
}
}
I was able to solve this