rs / zerolog

Zero Allocation JSON Logger
MIT License
10.39k stars 566 forks source link

Add TriggerLevelWriter #602

Closed mitar closed 9 months ago

mitar commented 11 months ago

Fixes #583.

mitar commented 11 months ago

In my own code, I then made:

func WithContext(ctx context.Context, writer io.Writer, level, conditionalLevel, triggerLevel zerolog.Level) (context.Context, func(), func()) {
    w := zerolog.NewTriggerLevelWriter(
        writer,
        conditionalLevel,
        triggerLevel,
    )
    ctxLogger := zerolog.New(w).Level(level).With().Timestamp().Logger()
    closeCtx := func() {
        _ = w.Close()
    }
    trigger := func() {
        _ = w.Trigger()
    }
    return ctxLogger.WithContext(ctx), closeCtx, trigger
}

One has then to call closeCtx after the context is not used anymore.

And I then have:

func NewHandler(writer io.Writer, level, conditionalLevel, triggerLevel zerolog.Level)) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
            ctx, closeCtx, trigger := WithContext(req.Context(), writer, level, conditionalLevel, triggerLevel)
            defer closeCtx()
            panicking := true
            defer func() {
                if panicking {
                    trigger()
                }
            }()
            req = req.WithContext(ctx)
            next.ServeHTTP(w, req)
            panicking = false
        })
    }
}

You can find them in my zerolog wrapper package.

mitar commented 9 months ago

@rs: I addressed your review comments.