From 181e11a330d5a021a3721f5cc77c95f06610c10a Mon Sep 17 00:00:00 2001 From: Airking05 Date: Tue, 20 Feb 2018 01:05:09 +0900 Subject: [PATCH] [Add] custom time stamp format #1046 (#1066) * [Add] custom time stamp format * [Update] property name & default value & comment about custom logger --- middleware/logger.go | 9 ++++++++- middleware/logger_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/middleware/logger.go b/middleware/logger.go index dfba093c..c7b80f8c 100644 --- a/middleware/logger.go +++ b/middleware/logger.go @@ -26,6 +26,7 @@ type ( // - time_unix_nano // - time_rfc3339 // - time_rfc3339_nano + // - time_custom // - id (Request ID) // - remote_ip // - uri @@ -46,7 +47,10 @@ type ( // Example "${remote_ip} ${status}" // // Optional. Default value DefaultLoggerConfig.Format. - Format string `yaml:"format"` + Format string `yaml:"format"` + + // Optional. Default value DefaultLoggerConfig.CustomTimeFormat. + CustomTimeFormat string `yaml:"custom_time_format"` // Output is a writer where logs in JSON format are written. // Optional. Default value os.Stdout. @@ -66,6 +70,7 @@ var ( `"method":"${method}","uri":"${uri}","status":${status}, "latency":${latency},` + `"latency_human":"${latency_human}","bytes_in":${bytes_in},` + `"bytes_out":${bytes_out}}` + "\n", + CustomTimeFormat:"2006-01-02 15:04:05.00000", Output: os.Stdout, colorer: color.New(), } @@ -126,6 +131,8 @@ func LoggerWithConfig(config LoggerConfig) echo.MiddlewareFunc { return buf.WriteString(time.Now().Format(time.RFC3339)) case "time_rfc3339_nano": return buf.WriteString(time.Now().Format(time.RFC3339Nano)) + case "time_custom": + return buf.WriteString(time.Now().Format(config.CustomTimeFormat)) case "id": id := req.Header.Get(echo.HeaderXRequestID) if id == "" { diff --git a/middleware/logger_test.go b/middleware/logger_test.go index adaa2186..b869bd8a 100644 --- a/middleware/logger_test.go +++ b/middleware/logger_test.go @@ -9,8 +9,11 @@ import ( "strings" "testing" + "encoding/json" "github.com/labstack/echo" "github.com/stretchr/testify/assert" + "time" + "unsafe" ) func TestLogger(t *testing.T) { @@ -137,3 +140,34 @@ func TestLoggerTemplate(t *testing.T) { assert.True(t, strings.Contains(buf.String(), token) == present, "Case: "+token) } } + +func TestLoggerCustomTimestamp(t *testing.T) { + buf := new(bytes.Buffer) + customTimeFormat := "2006-01-02 15:04:05.00000" + e := echo.New() + e.Use(LoggerWithConfig(LoggerConfig{ + Format: `{"time":"${time_custom}","id":"${id}","remote_ip":"${remote_ip}","host":"${host}","user_agent":"${user_agent}",` + + `"method":"${method}","uri":"${uri}","status":${status}, "latency":${latency},` + + `"latency_human":"${latency_human}","bytes_in":${bytes_in}, "path":"${path}", "referer":"${referer}",` + + `"bytes_out":${bytes_out},"ch":"${header:X-Custom-Header}",` + + `"us":"${query:username}", "cf":"${form:username}", "session":"${cookie:session}"}` + "\n", + CustomTimeFormat: customTimeFormat, + Output: buf, + })) + + e.GET("/", func(c echo.Context) error { + return c.String(http.StatusOK, "custom time stamp test") + }) + + req := httptest.NewRequest(echo.GET, "/", nil) + rec := httptest.NewRecorder() + e.ServeHTTP(rec, req) + + var objs map[string]*json.RawMessage + if err := json.Unmarshal([]byte(buf.String()), &objs); err != nil { + panic(err) + } + loggedTime := *(*string)(unsafe.Pointer(objs["time"])) + _, err := time.Parse(customTimeFormat, loggedTime) + assert.Error(t, err) +}