Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions json_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@
}

// 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 {

Check failure on line 31 in json_logger.go

View workflow job for this annotation

GitHub Actions / lint / Go

The line is 127 characters long, which exceeds the maximum of 120 characters. (lll)
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,
Expand All @@ -57,14 +57,16 @@
}

// 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

Expand Down Expand Up @@ -217,9 +219,10 @@

// 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)
Expand Down Expand Up @@ -247,6 +250,12 @@
}
}

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) {
Expand Down Expand Up @@ -332,5 +341,5 @@
}
}

return newJSONLeveledLoggerForScope(scope, logLevel, f.writer)
return newJSONLeveledLoggerForScope(scope, logLevel, f.writer, f.customizeTimestamp)
}
10 changes: 5 additions & 5 deletions json_logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)

Expand All @@ -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)

Expand Down
Loading