fix(be):log middleware
This commit is contained in:
parent
a0707d4853
commit
d45c44a2ba
@ -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'
|
||||
|
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:
|
||||
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:
|
||||
|
@ -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