package logger import ( "context" "log/slog" "testing" "time" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) type captureState struct { writes []capturedWrite } type capturedWrite struct { fields []zapcore.Field } type captureCore struct { state *captureState withFields []zapcore.Field } func newCaptureCore() *captureCore { return &captureCore{state: &captureState{}} } func (c *captureCore) Enabled(zapcore.Level) bool { return true } func (c *captureCore) With(fields []zapcore.Field) zapcore.Core { nextFields := make([]zapcore.Field, 0, len(c.withFields)+len(fields)) nextFields = append(nextFields, c.withFields...) nextFields = append(nextFields, fields...) return &captureCore{ state: c.state, withFields: nextFields, } } func (c *captureCore) Check(entry zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { return ce.AddCore(entry, c) } func (c *captureCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { allFields := make([]zapcore.Field, 0, len(c.withFields)+len(fields)) allFields = append(allFields, c.withFields...) allFields = append(allFields, fields...) c.state.writes = append(c.state.writes, capturedWrite{ fields: allFields, }) return nil } func (c *captureCore) Sync() error { return nil } func TestSlogZapHandler_Handle_DoesNotAppendTimeField(t *testing.T) { core := newCaptureCore() handler := newSlogZapHandler(zap.New(core)) record := slog.NewRecord(time.Date(2026, 1, 1, 12, 0, 0, 0, time.UTC), slog.LevelInfo, "hello", 0) record.AddAttrs(slog.String("component", "http.access")) if err := handler.Handle(context.Background(), record); err != nil { t.Fatalf("handle slog record: %v", err) } if len(core.state.writes) != 1 { t.Fatalf("write calls = %d, want 1", len(core.state.writes)) } var hasComponent bool for _, field := range core.state.writes[0].fields { if field.Key == "time" { t.Fatalf("unexpected duplicate time field in slog adapter output") } if field.Key == "component" { hasComponent = true } } if !hasComponent { t.Fatalf("component field should be preserved") } }