diff --git a/internal/logging/logging.go b/internal/logging/logging.go index 7265a0b..ec64c03 100644 --- a/internal/logging/logging.go +++ b/internal/logging/logging.go @@ -1,6 +1,7 @@ package logging import ( + "fmt" "io" "log" "strings" @@ -19,20 +20,25 @@ func SetOutput(output io.Writer) { func Debug(args ...any) { if debug.Load() { - log.Print(args...) + log.Print(safeLogMessage(fmt.Sprint(args...))) } } func Debugf(format string, args ...any) { if debug.Load() { - log.Printf(format, args...) + log.Print(safeLogMessage(fmt.Sprintf(format, args...))) } } -func Info(args ...any) { log.Print(args...) } -func Infof(format string, args ...any) { log.Printf(format, args...) } -func Warn(args ...any) { log.Print(args...) } -func Warnf(format string, args ...any) { log.Printf(format, args...) } -func Errorf(format string, args ...any) { log.Printf(format, args...) } -func Fatal(args ...any) { log.Fatal(args...) } -func Fatalf(format string, args ...any) { log.Fatalf(format, args...) } +func Info(args ...any) { log.Print(safeLogMessage(fmt.Sprint(args...))) } +func Infof(format string, args ...any) { log.Print(safeLogMessage(fmt.Sprintf(format, args...))) } +func Warn(args ...any) { log.Print(safeLogMessage(fmt.Sprint(args...))) } +func Warnf(format string, args ...any) { log.Print(safeLogMessage(fmt.Sprintf(format, args...))) } +func Errorf(format string, args ...any) { log.Print(safeLogMessage(fmt.Sprintf(format, args...))) } +func Fatal(args ...any) { log.Fatal(safeLogMessage(fmt.Sprint(args...))) } +func Fatalf(format string, args ...any) { log.Fatal(safeLogMessage(fmt.Sprintf(format, args...))) } + +func safeLogMessage(message string) string { + message = strings.ReplaceAll(message, "\r", "") + return strings.ReplaceAll(message, "\n", " ") +} diff --git a/internal/logging/logging_test.go b/internal/logging/logging_test.go new file mode 100644 index 0000000..c50a8da --- /dev/null +++ b/internal/logging/logging_test.go @@ -0,0 +1,25 @@ +package logging + +import ( + "bytes" + "log" + "strings" + "testing" +) + +func TestInfoProducesSingleRecord(t *testing.T) { + var output bytes.Buffer + originalWriter := log.Writer() + originalFlags := log.Flags() + defer func() { + log.SetOutput(originalWriter) + log.SetFlags(originalFlags) + }() + log.SetOutput(&output) + log.SetFlags(0) + + Infof("source=%s", "first\r\nforged\nthird") + if got := strings.TrimSuffix(output.String(), "\n"); got != "source=first forged third" { + t.Fatalf("unexpected log record: %q", got) + } +}