diff --git a/logger.go b/logger.go index 1e6cf77a..54f7a2c8 100644 --- a/logger.go +++ b/logger.go @@ -11,6 +11,7 @@ import ( "os" "time" + "github.com/gin-gonic/gin/internal/bytesconv" "github.com/mattn/go-isatty" ) @@ -37,7 +38,7 @@ var consoleColorMode = autoColor // LoggerConfig defines the config for Logger middleware. type LoggerConfig struct { - // Optional. Default value is gin.defaultLogFormatter + // Formatter is optional, the default value is gin.defaultLogFormatter Formatter LogFormatter // Output is a writer where logs are written. @@ -266,7 +267,9 @@ func LoggerWithConfig(conf LoggerConfig) HandlerFunc { param.Path = path - fmt.Fprint(out, formatter(param)) + if _, err := out.Write(bytesconv.StringToBytes(formatter(param))); err != nil { + debugPrintError(err) + } } } } diff --git a/logger_test.go b/logger_test.go index b93e1e04..cc7ddb65 100644 --- a/logger_test.go +++ b/logger_test.go @@ -147,6 +147,15 @@ func TestLoggerWithConfig(t *testing.T) { assert.Contains(t, buffer.String(), "/notfound") } +func TestLoggerWithConfigWriteError(t *testing.T) { + w := &mockErrWriter{} + router := New() + router.Use(LoggerWithConfig(LoggerConfig{Output: w})) + router.GET("/example", func(c *Context) {}) + PerformRequest(router, "GET", "/example?a=100") + assert.True(t, w.triggerErrorWrite) +} + func TestLoggerWithFormatter(t *testing.T) { buffer := new(strings.Builder) @@ -434,3 +443,12 @@ func TestForceConsoleColor(t *testing.T) { // reset console color mode. consoleColorMode = autoColor } + +type mockErrWriter struct { + triggerErrorWrite bool +} + +func (w *mockErrWriter) Write(p []byte) (n int, err error) { + w.triggerErrorWrite = true + return 0, errors.New("test error writer") +}