89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
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")
|
|
}
|
|
}
|