From 20750bc33a7d66e9f4da57b6018b78edcfc4b850 Mon Sep 17 00:00:00 2001 From: engigu Date: Tue, 2 Jan 2024 18:08:52 +0800 Subject: [PATCH] fix: adjust log middleware --- conf/app.example.ini | 2 +- middleware/log.go | 110 ++++++++++++++------------- service/cron_service/cron_service.go | 2 +- service/cron_service/tasks.go | 2 +- web/public/favicon111.ico | Bin 1150 -> 0 bytes 5 files changed, 60 insertions(+), 56 deletions(-) delete mode 100644 web/public/favicon111.ico diff --git a/conf/app.example.ini b/conf/app.example.ini index d6e3f3c..dde735c 100644 --- a/conf/app.example.ini +++ b/conf/app.example.ini @@ -9,7 +9,7 @@ HttpPort = 8000 ReadTimeout = 60 WriteTimeout = 60 ; use embed html static file -; EmbedHtml = disable +EmbedHtml = disable [database] Type = mysql diff --git a/middleware/log.go b/middleware/log.go index 15940c6..4ab516a 100644 --- a/middleware/log.go +++ b/middleware/log.go @@ -2,79 +2,83 @@ package middleware import ( "fmt" - "github.com/gin-gonic/gin" + "math" "message-nest/pkg/logging" + "net/http" + "net/url" "time" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" ) -const ( - status200 = 42 - status404 = 43 - status500 = 41 +//var timeFormat = "02/Jan/2006:15:04:05 -0700" - methodGET = 44 -) +// LogMiddleware Logger is the logrus logger handler +func LogMiddleware(notLogged ...string) gin.HandlerFunc { + //hostname, err := os.Hostname() + //if err != nil { + // hostname = "unknown" + //} -func formatDuration(duration time.Duration) string { - seconds := duration.Seconds() - switch { - case seconds >= 1: - return fmt.Sprintf("%.2fs", seconds) - default: - return fmt.Sprintf("%.3fms", float64(duration.Milliseconds())) - //default: - // return fmt.Sprintf("%dns", duration.Nanoseconds()) - //case duration.Milliseconds() >= 1: - // return fmt.Sprintf("%.2fms", float64(duration.Milliseconds())) - //default: - // return fmt.Sprintf("%dns", duration.Nanoseconds()) + var skip map[string]struct{} + + if length := len(notLogged); length > 0 { + skip = make(map[string]struct{}, length) + + for _, p := range notLogged { + skip[p] = struct{}{} + } } -} -func LogMiddleware() gin.HandlerFunc { return func(c *gin.Context) { - start := time.Now() path := c.Request.URL.Path raw := c.Request.URL.RawQuery + start := time.Now() - // Process request c.Next() - // Log only when path is not being skipped - - // Stop timer - end := time.Now() - timeSub := end.Sub(start) - dr := formatDuration(timeSub) - clientIP := c.ClientIP() - method := c.Request.Method + stop := time.Since(start) + latency := int(math.Ceil(float64(stop.Nanoseconds()) / 1000000.0)) statusCode := c.Writer.Status() - //bodySize := c.Writer.Size() + clientIP := c.ClientIP() + //clientUserAgent := c.Request.UserAgent() + //referer := c.Request.Referer() + dataLength := c.Writer.Size() + if dataLength < 0 { + dataLength = 0 + } if raw != "" { + raw, _ := url.QueryUnescape(raw) path = path + "?" + raw } - - var statusColor string - switch statusCode { - case 200: - statusColor = fmt.Sprintf("\033[%dm %d \033[0m", status200, statusCode) - case 500: - statusColor = fmt.Sprintf("\033[%dm %d \033[0m", status500, statusCode) - default: - statusColor = fmt.Sprintf("\033[%dm %d \033[0m", status404, statusCode) + if _, ok := skip[path]; ok { + return } - var methodColor string - methodColor = fmt.Sprintf("\033[%dm %s \033[0m", methodGET, method) - - logging.Logger.Infof("[GIN]|%s|%s|%s|%s| %s", - //start.Format("2006-01-02 15:04:06"), - statusColor, - dr, - clientIP, - methodColor, - path, - ) + entry := logging.Logger.WithFields(logrus.Fields{ + //"hostname": hostname, + "statusCode": statusCode, + "latency": latency, // time to process + "clientIP": clientIP, + "method": c.Request.Method, + "path": path, + //"referer": referer, + "dataLength": dataLength, + //"userAgent": clientUserAgent, + }) + if len(c.Errors) > 0 { + entry.Error(c.Errors.ByType(gin.ErrorTypePrivate).String()) + } else { + msg := fmt.Sprintf("[Gin] %s [%s] %s %d %d (%dms)", clientIP, c.Request.Method, path, statusCode, dataLength, latency) + if statusCode >= http.StatusInternalServerError { + entry.Error(msg) + } else if statusCode >= http.StatusBadRequest { + entry.Warn(msg) + } else { + entry.Info(msg) + } + } } } diff --git a/service/cron_service/cron_service.go b/service/cron_service/cron_service.go index fdfea67..73a11c0 100644 --- a/service/cron_service/cron_service.go +++ b/service/cron_service/cron_service.go @@ -68,7 +68,7 @@ func (cs *CronService) UpdateLogsCronRun(cron string) { Job: ClearLogs, }) logging.Logger.Error(fmt.Sprintf("更新日志的cron成功,%s", cron)) - logging.Logger.Info(fmt.Sprintf("所有的定时任务: %s", TaskList)) + logging.Logger.Error(fmt.Sprintf("所有的定时任务: %s", TaskList)) } diff --git a/service/cron_service/tasks.go b/service/cron_service/tasks.go index 7b9241d..ea726a2 100644 --- a/service/cron_service/tasks.go +++ b/service/cron_service/tasks.go @@ -36,7 +36,7 @@ func AddTask(task ScheduledTask) cron.EntryID { logging.Logger.Error(fmt.Sprintf("添加定时任务失败,原因:%s", err)) } else { TaskList[taskId] = &task - logging.Logger.Error(fmt.Sprintf("添加日志清除任务成功,entryID: %d, cron: %s", taskId, task.Schedule)) + logging.Logger.Error(fmt.Sprintf("添加定时任务成功,entryID: %d, cron: %s", taskId, task.Schedule)) } return taskId } diff --git a/web/public/favicon111.ico b/web/public/favicon111.ico deleted file mode 100644 index def96c4ab0971338aba7f8da8a5c8d0bfa25d3f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmd5)Nl%ke6uk&aBBDqF^edFss&t|Qv>%j~Kmps*mXE2HR;ZLw3sQ-IA_R~SCqzLJ z8A4KIw@o7Xd#aB0!X*O^Wkmdo*>nCe;PTEi}i+ z@qc-z<-Q$l~JMm_-WPD&jTkq@< z%ETcOoqE?p8LI*{PjXP?GF9_h9G~N_mu}QgzQdA=C1kQz(PUZ1%DQau ztIlpNz<#Av4zySX28i+%oz}K+Zso3W+w-vU*)+P!H!#hxhz8R#>PM4v4*7+ zg9{=?qgB}S5S^6*vh<{c$PVW`>!B4@H}bKee-4d?c{G~-px*e6@S2wm>C0#~f5$5$ z?@@Ev(U!724IwkNASkmmQN75fK1KAn|fs5&qk`xPV{u7x^s}zW?7de zD()!7a(=8t22}4E5Ei61hId+#HCTXQQx(YSwIi#~L1H(u`W;?h)>tXgZ5Y{P{wdeR z8&%Sn0Hsn1(hMEQ^@&REUDwyJ7an8{xx95@Pl?ZP5qh;J=eE5jEAd2K?khD%92iT} z-v6ToQm_H+6WLQPaT|>*TYXcV3{v+pklN~fi@P$B-EKj?C-sX=r_zdS8c?$ZyZ=u| zi9vgqb3npqi;i7$e2C~NTBC-`k(#PP_CPUmx(a`ttg_6=HF7l|1BsMuw{|Bm`W=ND zlBi;0*wNNBtFSDiS>R^cMMdUXnK?N{&6gY!rfQ%JSUV+qg1sX^#$eqaV9pm{)(4>V Se;{YA