fix(be):log middleware
This commit is contained in:
parent
a0707d4853
commit
d45c44a2ba
@ -2,10 +2,10 @@ debug: true
|
|||||||
demo: false
|
demo: false
|
||||||
db: mysql
|
db: mysql
|
||||||
mysql:
|
mysql:
|
||||||
hostname: 172.16.101.32
|
hostname: localhost
|
||||||
port: 3306
|
port: 3306
|
||||||
username: root
|
username: next-terminal
|
||||||
password: mysql
|
password: next-terminal
|
||||||
database: next-terminal
|
database: next-terminal
|
||||||
sqlite:
|
sqlite:
|
||||||
file: 'next-terminal.db'
|
file: 'next-terminal.db'
|
||||||
|
97
pkg/middleware/logger.go
Normal file
97
pkg/middleware/logger.go
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,28 +18,28 @@ services:
|
|||||||
next-terminal:
|
next-terminal:
|
||||||
ipv4_address: 172.77.77.2
|
ipv4_address: 172.77.77.2
|
||||||
|
|
||||||
next-terminal:
|
# next-terminal:
|
||||||
container_name: next-terminal
|
# container_name: next-terminal
|
||||||
image: "dushixiang/next-terminal:latest"
|
# image: "dushixiang/next-terminal:latest"
|
||||||
environment:
|
# environment:
|
||||||
DB: "mysql"
|
# DB: "mysql"
|
||||||
MYSQL_HOSTNAME: "mysql"
|
# MYSQL_HOSTNAME: "mysql"
|
||||||
MYSQL_PORT: 3306
|
# MYSQL_PORT: 3306
|
||||||
MYSQL_USERNAME: "next-terminal"
|
# MYSQL_USERNAME: "next-terminal"
|
||||||
MYSQL_PASSWORD: "next-terminal"
|
# MYSQL_PASSWORD: "next-terminal"
|
||||||
MYSQL_DATABASE: "next-terminal"
|
# MYSQL_DATABASE: "next-terminal"
|
||||||
ports:
|
# ports:
|
||||||
- "8088:8088"
|
# - "8088:8088"
|
||||||
volumes:
|
# volumes:
|
||||||
- ./drive:/usr/local/next-terminal/drive
|
# - ./drive:/usr/local/next-terminal/drive
|
||||||
- ./recording:/usr/local/next-terminal/recording
|
# - ./recording:/usr/local/next-terminal/recording
|
||||||
depends_on:
|
# depends_on:
|
||||||
- mysql
|
# - mysql
|
||||||
networks:
|
# networks:
|
||||||
next-terminal:
|
# next-terminal:
|
||||||
ipv4_address: 172.77.77.3
|
# ipv4_address: 172.77.77.3
|
||||||
restart:
|
# restart:
|
||||||
always
|
# always
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
next-terminal:
|
next-terminal:
|
||||||
|
@ -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
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user