From d45c44a2baf0f29a018e7b9e0d959541bada7ca4 Mon Sep 17 00:00:00 2001 From: neverteaser Date: Thu, 18 Mar 2021 19:05:40 +0800 Subject: [PATCH] fix(be):log middleware --- config.yml | 6 +- pkg/middleware/logger.go | 97 +++++++++++++++++ playground/docker-compose.yml | 44 ++++---- server/log/logger.go | 193 ---------------------------------- 4 files changed, 122 insertions(+), 218 deletions(-) create mode 100644 pkg/middleware/logger.go delete mode 100644 server/log/logger.go diff --git a/config.yml b/config.yml index 77d97dd..e538301 100644 --- a/config.yml +++ b/config.yml @@ -2,10 +2,10 @@ debug: true demo: false db: mysql mysql: - hostname: 172.16.101.32 + hostname: localhost port: 3306 - username: root - password: mysql + username: next-terminal + password: next-terminal database: next-terminal sqlite: file: 'next-terminal.db' diff --git a/pkg/middleware/logger.go b/pkg/middleware/logger.go new file mode 100644 index 0000000..ec4a985 --- /dev/null +++ b/pkg/middleware/logger.go @@ -0,0 +1,97 @@ +package middleware + +import ( + "fmt" + "os" + "path" + "time" + + "github.com/labstack/echo/v4" + "github.com/sirupsen/logrus" +) + +func Logger() *logrus.Logger { + now := time.Now() + logFilePath := "" + if dir, err := os.Getwd(); err == nil { + logFilePath = dir + "/log/" + } + if err := os.MkdirAll(logFilePath, 0755); err != nil { + fmt.Println(err.Error()) + } + logFileName := now.Format("2006-01-02") + ".log" + //日志文件 + fileName := path.Join(logFilePath, logFileName) + if _, err := os.Stat(fileName); err != nil { + if _, err := os.Create(fileName); err != nil { + fmt.Println(err.Error()) + } + } + //写入文件 + src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend) + if err != nil { + fmt.Println("err", err) + } + + //实例化 + logger := logrus.New() + + //设置输出 + logger.Out = src + logger.SetOutput(os.Stdout) + + //设置日志级别 + logger.SetLevel(logrus.DebugLevel) + //logger.Out := fmt. + //设置日志格式 + logger.SetFormatter(&logrus.TextFormatter{ + TimestampFormat: "2006-01-02 15:04:05", + }) + return logger +} + +func LoggerToFile() echo.MiddlewareFunc { + logger := Logger() + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) (err error) { + if err = next(c); err != nil { + c.Error(err) + } + req := c.Request() + resp := c.Response() + startTime := time.Now() + + // 处理请求 + + // 结束时间 + endTime := time.Now() + + // 执行时间 + latencyTime := endTime.Sub(startTime) + + // 请求方式 + reqMethod := req.Method + + // 请求路由 + reqUri := req.URL + + // 状态码 + statusCode := resp.Status + + // 请求IP + clientIP := req.RemoteAddr + //logger.Formatter + // TODO log Formatter + //日志格式 + logger.Infof("| %3d | %13v | %15s | %s | %s |", + statusCode, + latencyTime, + clientIP, + reqMethod, + reqUri, + ) + return + } + } + +} diff --git a/playground/docker-compose.yml b/playground/docker-compose.yml index d4e7860..392f982 100644 --- a/playground/docker-compose.yml +++ b/playground/docker-compose.yml @@ -18,28 +18,28 @@ services: next-terminal: ipv4_address: 172.77.77.2 - next-terminal: - container_name: next-terminal - image: "dushixiang/next-terminal:latest" - environment: - DB: "mysql" - MYSQL_HOSTNAME: "mysql" - MYSQL_PORT: 3306 - MYSQL_USERNAME: "next-terminal" - MYSQL_PASSWORD: "next-terminal" - MYSQL_DATABASE: "next-terminal" - ports: - - "8088:8088" - volumes: - - ./drive:/usr/local/next-terminal/drive - - ./recording:/usr/local/next-terminal/recording - depends_on: - - mysql - networks: - next-terminal: - ipv4_address: 172.77.77.3 - restart: - always +# next-terminal: +# container_name: next-terminal +# image: "dushixiang/next-terminal:latest" +# environment: +# DB: "mysql" +# MYSQL_HOSTNAME: "mysql" +# MYSQL_PORT: 3306 +# MYSQL_USERNAME: "next-terminal" +# MYSQL_PASSWORD: "next-terminal" +# MYSQL_DATABASE: "next-terminal" +# ports: +# - "8088:8088" +# volumes: +# - ./drive:/usr/local/next-terminal/drive +# - ./recording:/usr/local/next-terminal/recording +# depends_on: +# - mysql +# networks: +# next-terminal: +# ipv4_address: 172.77.77.3 +# restart: +# always networks: next-terminal: diff --git a/server/log/logger.go b/server/log/logger.go deleted file mode 100644 index ed3c485..0000000 --- a/server/log/logger.go +++ /dev/null @@ -1,193 +0,0 @@ -package log - -import ( - "io" - "strconv" - "time" - - "github.com/labstack/echo/v4" - "github.com/labstack/gommon/log" - "github.com/sirupsen/logrus" -) - -// Logrus : implement Logger -type Logrus struct { - *logrus.Logger -} - -// Logger ... -var Logger = logrus.New() - -// GetEchoLogger for e.Logger -func GetEchoLogger() Logrus { - return Logrus{Logger} -} - -// Level returns logger level -func (l Logrus) Level() log.Lvl { - switch l.Logger.Level { - case logrus.DebugLevel: - return log.DEBUG - case logrus.WarnLevel: - return log.WARN - case logrus.ErrorLevel: - return log.ERROR - case logrus.InfoLevel: - return log.INFO - default: - l.Panic("Invalid level") - } - - return log.OFF -} - -// SetHeader is a stub to satisfy interface -// It's controlled by Logger -func (l Logrus) SetHeader(_ string) {} - -// SetPrefix It's controlled by Logger -func (l Logrus) SetPrefix(s string) {} - -// Prefix It's controlled by Logger -func (l Logrus) Prefix() string { - return "" -} - -// SetLevel set level to logger from given log.Lvl -func (l Logrus) SetLevel(lvl log.Lvl) { - switch lvl { - case log.DEBUG: - Logger.SetLevel(logrus.DebugLevel) - case log.WARN: - Logger.SetLevel(logrus.WarnLevel) - case log.ERROR: - Logger.SetLevel(logrus.ErrorLevel) - case log.INFO: - Logger.SetLevel(logrus.InfoLevel) - default: - l.Panic("Invalid level") - } -} - -// Output logger output func -func (l Logrus) Output() io.Writer { - return l.Out -} - -// SetOutput change output, default os.Stdout -func (l Logrus) SetOutput(w io.Writer) { - Logger.SetOutput(w) -} - -// Printj print json log -func (l Logrus) Printj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Print() -} - -// Debugj debug json log -func (l Logrus) Debugj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Debug() -} - -// Infoj info json log -func (l Logrus) Infoj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Info() -} - -// Warnj warning json log -func (l Logrus) Warnj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Warn() -} - -// Errorj error json log -func (l Logrus) Errorj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Error() -} - -// Fatalj fatal json log -func (l Logrus) Fatalj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Fatal() -} - -// Panicj panic json log -func (l Logrus) Panicj(j log.JSON) { - Logger.WithFields(logrus.Fields(j)).Panic() -} - -// Print string log -func (l Logrus) Print(i ...interface{}) { - Logger.Print(i[0].(string)) -} - -// Debug string log -func (l Logrus) Debug(i ...interface{}) { - Logger.Debug(i[0].(string)) -} - -// Info string log -func (l Logrus) Info(i ...interface{}) { - Logger.Info(i[0].(string)) -} - -// Warn string log -func (l Logrus) Warn(i ...interface{}) { - Logger.Warn(i[0].(string)) -} - -// Error string log -func (l Logrus) Error(i ...interface{}) { - Logger.Error(i[0].(string)) -} - -// Fatal string log -func (l Logrus) Fatal(i ...interface{}) { - Logger.Fatal(i[0].(string)) -} - -// Panic string log -func (l Logrus) Panic(i ...interface{}) { - Logger.Panic(i[0].(string)) -} - -func logrusMiddlewareHandler(c echo.Context, next echo.HandlerFunc) error { - req := c.Request() - res := c.Response() - start := time.Now() - if err := next(c); err != nil { - c.Error(err) - } - stop := time.Now() - - p := req.URL.Path - - bytesIn := req.Header.Get(echo.HeaderContentLength) - - Logger.WithFields(map[string]interface{}{ - "time_rfc3339": time.Now().Format(time.RFC3339), - "remote_ip": c.RealIP(), - "host": req.Host, - "uri": req.RequestURI, - "method": req.Method, - "path": p, - "referer": req.Referer(), - "user_agent": req.UserAgent(), - "status": res.Status, - "latency": strconv.FormatInt(stop.Sub(start).Nanoseconds()/1000, 10), - "latency_human": stop.Sub(start).String(), - "bytes_in": bytesIn, - "bytes_out": strconv.FormatInt(res.Size, 10), - }).Info("Handled request") - - return nil -} - -func logger(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - return logrusMiddlewareHandler(c, next) - } -} - -// Hook is a function to process log. -func Hook() echo.MiddlewareFunc { - return logger -}