diff --git a/promslog/slog.go b/promslog/slog.go index f77ce91e..1677605a 100644 --- a/promslog/slog.go +++ b/promslog/slog.go @@ -66,6 +66,17 @@ var ( default: } + return a + } + truncateSourceAttrFunc = func(groups []string, a slog.Attr) slog.Attr { + if a.Key != slog.SourceKey { + return a + } + + if src, ok := a.Value.Any().(*slog.Source); ok { + a.Value = slog.StringValue(filepath.Base(src.File) + ":" + strconv.Itoa(src.Line)) + } + return a } ) @@ -165,8 +176,9 @@ func New(config *Config) *slog.Logger { } logHandlerOpts := &slog.HandlerOptions{ - Level: config.Level.lvl, - AddSource: true, + Level: config.Level.lvl, + AddSource: true, + ReplaceAttr: truncateSourceAttrFunc, } if config.Style == GoKitStyle { diff --git a/promslog/slog_test.go b/promslog/slog_test.go index ffc4ea4c..cc95a64c 100644 --- a/promslog/slog_test.go +++ b/promslog/slog_test.go @@ -146,3 +146,47 @@ func TestDynamicLevels(t *testing.T) { }) } } + +func TestTruncateSourceFileName_DefaultStyle(t *testing.T) { + var buf bytes.Buffer + + config := &Config{ + Writer: &buf, + } + + logger := New(config) + logger.Info("test message") + + output := buf.String() + + if !strings.Contains(output, "source=slog_test.go:") { + t.Errorf("Expected source file name to be truncated to basename, got: %s", output) + } + + if strings.Contains(output, "/") { + t.Errorf("Expected no directory separators in source file name, got: %s", output) + } +} + +func TestTruncateSourceFileName_GoKitStyle(t *testing.T) { + var buf bytes.Buffer + + config := &Config{ + Writer: &buf, + Style: GoKitStyle, + } + + logger := New(config) + logger.Info("test message") + + output := buf.String() + + // In GoKitStyle, the source key is "caller". + if !strings.Contains(output, "caller=slog_test.go:") { + t.Errorf("Expected caller to contain basename of source file, got: %s", output) + } + + if strings.Contains(output, "/") { + t.Errorf("Expected no directory separators in caller, got: %s", output) + } +}