Skip to content

Commit 6e5ec17

Browse files
committed
fix: TeeHandler should call Handler on a dependent handler only if it is enabled for the given record
On closer inspection, `Handler.Handle()` should only be called if the `Handler` is enabled for the given record. This fixes that for the `TeeHandler` checking this for each dependent handler. Note, the implementation of `Enabled` is still valid, and prevents `Handle` from even being called in cases where no dependent handler is enabled for the given record. This fix is important as without it, all logs end up in the error log file.
1 parent 3a5188d commit 6e5ec17

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

internal/log/tee_handler.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ func (t *TeeHandler) Handle(ctx context.Context, r slog.Record) error {
5959

6060
errs := []error{}
6161
for _, h := range t.handlers {
62-
errs = append(errs, h.Handle(ctx, r))
62+
if h.Enabled(ctx, r.Level) {
63+
errs = append(errs, h.Handle(ctx, r))
64+
}
6365
}
6466
return errors.Join(errs...)
6567
}

internal/log/tee_handler_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,30 @@ func TestTeeHandler_Handle(t *testing.T) {
104104
assert.Contains(t, handler2.Output.String(), "level=WARN msg=test key=value")
105105
})
106106

107+
t.Run("handlers with different log levels handle correctly", func(t *testing.T) {
108+
allLevelsHandler := NewTestHandler(&slog.HandlerOptions{})
109+
errorLevelHandler := NewTestHandler(&slog.HandlerOptions{Level: slog.LevelError})
110+
111+
testingHandler := log.NewTeeHandler(allLevelsHandler, errorLevelHandler)
112+
113+
err := testingHandler.Handle(t.Context(), slog.Record{
114+
Level: slog.LevelInfo,
115+
Message: "info message",
116+
})
117+
require.NoError(t, err)
118+
119+
err = testingHandler.Handle(t.Context(), slog.Record{
120+
Level: slog.LevelError,
121+
Message: "error message",
122+
})
123+
require.NoError(t, err)
124+
125+
assert.Contains(t, allLevelsHandler.Output.String(), "info message")
126+
assert.NotContains(t, errorLevelHandler.Output.String(), "info message")
127+
assert.Contains(t, allLevelsHandler.Output.String(), "error message")
128+
assert.Contains(t, errorLevelHandler.Output.String(), "error message")
129+
})
130+
107131
}
108132

109133
// TestTeeHandler_WithAttrs tests that a TeeHandler is returned that applies the given attributes to each handled record.

0 commit comments

Comments
 (0)