diff --git a/json_logger.go b/json_logger.go index f63ffc8..c93b3a8 100644 --- a/json_logger.go +++ b/json_logger.go @@ -28,14 +28,14 @@ func (jl *jsonLeveledLogger) Slog() *slog.Logger { } // newJSONLeveledLoggerForScope returns a configured JSON LeveledLogger. -func newJSONLeveledLoggerForScope(scope string, level LogLevel, writer io.Writer) *jsonLeveledLogger { +func newJSONLeveledLoggerForScope(scope string, level LogLevel, writer io.Writer, customizeTimestamp bool) *jsonLeveledLogger { if writer == nil { writer = os.Stderr } // Create a JSON handler with custom options lw := &loggerWriter{output: writer} - logger := slog.New(newJSONHandlerHelper(lw)) + logger := slog.New(newJSONHandlerHelper(lw, customizeTimestamp)) return &jsonLeveledLogger{ level: level, @@ -57,14 +57,16 @@ func (jl *jsonLeveledLogger) WithOutput(output io.Writer) LeveledLogger { } // newJSONHandlerHelper creates a new JSON slog.Handler with custom formatting. -func newJSONHandlerHelper(w io.Writer) slog.Handler { +func newJSONHandlerHelper(w io.Writer, customizeTimestamp bool) slog.Handler { return slog.NewJSONHandler(w, &slog.HandlerOptions{ Level: slog.Level(-8), // Allow all levels, filter ourselves ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr { // Customize timestamp format switch attr.Key { case slog.TimeKey: - attr.Value = slog.StringValue(attr.Value.Time().Format(time.RFC3339)) + if customizeTimestamp { + attr.Value = slog.StringValue(attr.Value.Time().Format(time.RFC3339)) + } return attr @@ -217,9 +219,10 @@ func (jl *jsonLeveledLogger) Errorf(format string, args ...any) { // jsonLoggerFactory defines levels by scopes and creates new jsonLeveledLogger. type jsonLoggerFactory struct { - writer io.Writer - defaultLogLevel LogLevel - scopeLevels map[string]LogLevel + writer io.Writer + defaultLogLevel LogLevel + scopeLevels map[string]LogLevel + customizeTimestamp bool } var _ LoggerFactory = (*jsonLoggerFactory)(nil) @@ -247,6 +250,12 @@ func WithJSONDefaultLevel(level LogLevel) JSONLoggerFactoryOption { } } +func WithoutCustomTimestamp() JSONLoggerFactoryOption { + return func(jlf *jsonLoggerFactory) { + jlf.customizeTimestamp = false + } +} + // WithJSONScopeLevels sets specific log levels for scopes, overriding env values. func WithJSONScopeLevels(levels map[string]LogLevel) JSONLoggerFactoryOption { return func(factory *jsonLoggerFactory) { @@ -332,5 +341,5 @@ func (f *jsonLoggerFactory) NewLogger(scope string) LeveledLogger { } } - return newJSONLeveledLoggerForScope(scope, logLevel, f.writer) + return newJSONLeveledLoggerForScope(scope, logLevel, f.writer, f.customizeTimestamp) } diff --git a/json_logger_test.go b/json_logger_test.go index 655bce6..be2d11d 100644 --- a/json_logger_test.go +++ b/json_logger_test.go @@ -17,7 +17,7 @@ import ( ) func TestJSONLoggerLevels(t *testing.T) { - logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr) + logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr, false) var outBuf bytes.Buffer logger.WithOutput(&outBuf) @@ -63,7 +63,7 @@ func TestJSONLoggerLevels(t *testing.T) { } func TestJSONLoggerFormatting(t *testing.T) { - logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr) + logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr, false) var outBuf bytes.Buffer logger.WithOutput(&outBuf) @@ -78,7 +78,7 @@ func TestJSONLoggerFormatting(t *testing.T) { } func TestJSONLoggerLevelFiltering(t *testing.T) { - logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr) + logger := newJSONLeveledLoggerForScope("test", LogLevelTrace, os.Stderr, false) var outBuf bytes.Buffer logger.WithOutput(&outBuf) @@ -212,7 +212,7 @@ func TestJSONLoggerFactorySupportsWithOutputInterface(t *testing.T) { } func TestJSONLoggerTraceOutput(t *testing.T) { - logger := newJSONLeveledLoggerForScope("trace-scope", LogLevelTrace, os.Stderr) + logger := newJSONLeveledLoggerForScope("trace-scope", LogLevelTrace, os.Stderr, false) var outBuf bytes.Buffer logger.WithOutput(&outBuf) @@ -237,7 +237,7 @@ func TestJSONLoggerTraceOutput(t *testing.T) { } func TestJSONLoggerStructuredOutput(t *testing.T) { - logger := newJSONLeveledLoggerForScope("test-scope", LogLevelInfo, os.Stderr) + logger := newJSONLeveledLoggerForScope("test-scope", LogLevelInfo, os.Stderr, false) var outBuf bytes.Buffer logger.WithOutput(&outBuf)