Hooks in zerolog not registering

308 Views Asked by At

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))
    }
}
1

There are 1 best solutions below

0
rak1n On

I was able to solve this

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