123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package logger
- import (
- "encoding/json"
- "fmt"
- "github.com/druidcaesa/gotool"
- "github.com/gin-gonic/gin"
- rotatelogs "github.com/lestrrat-go/file-rotatelogs"
- "github.com/rifflock/lfshook"
- "github.com/sirupsen/logrus"
- "os"
- "path"
- "strconv"
- "time"
- "ulink-admin/config"
- "ulink-admin/frame"
- "ulink-admin/modules/system/models/model"
- "ulink-admin/modules/system/service"
- "ulink-admin/pkg/jwt/admin"
- "ulink-admin/pkg/resp"
- )
- type Logger struct {
- LogService *service.SysOperLogService `inject:""`
- }
- func NewLogger() *Logger {
- return &Logger{}
- }
- // 日志记录到文件
- func (v *Logger) LoggerToFile() func(c *frame.Context) {
- logFilePath := config.GetLoggerCfg().LogPath
- logFileName := config.GetLoggerCfg().LogName
- // 日志文件
- fileName := path.Join(logFilePath, logFileName)
- if !gotool.FileUtils.Exists(fileName) {
- create, err := os.Create(fileName)
- if err != nil {
- gotool.Logs.ErrorLog().Println(err)
- }
- defer create.Close()
- //gotool.FileUtils.Create(fileName)
- }
- // 写入文件
- 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.SetLevel(logrus.DebugLevel)
- // 设置 rotatelogs
- logWriter, err := rotatelogs.New(
- // 分割后的文件名称
- fileName+".%Y%m%d.log",
- // 生成软链,指向最新日志文件
- rotatelogs.WithLinkName(fileName),
- // 设置最大保存时间(7天)
- rotatelogs.WithMaxAge(7*24*time.Hour),
- // 设置日志切割时间间隔(1天)
- rotatelogs.WithRotationTime(24*time.Hour),
- )
- writeMap := lfshook.WriterMap{
- logrus.InfoLevel: logWriter,
- logrus.FatalLevel: logWriter,
- logrus.DebugLevel: logWriter,
- logrus.WarnLevel: logWriter,
- logrus.ErrorLevel: logWriter,
- logrus.PanicLevel: logWriter,
- }
- lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{
- TimestampFormat: "2006-01-02 15:04:05",
- })
- // 新增 Hook
- logger.AddHook(lfHook)
- return func(c *frame.Context) {
- c.Get("permission")
- // 开始时间
- startTime := time.Now()
- // 处理请求
- c.Next()
- // 结束时间
- endTime := time.Now()
- // 执行时间
- latencyTime := endTime.Sub(startTime)
- // 请求方式
- reqMethod := c.Request.Method
- // 请求路由
- reqUri := c.Request.RequestURI
- // 状态码
- statusCode := c.Writer.Status()
- // 请求IP
- clientIP := c.ClientIP()
- user := admin.GetUserInfo(c)
- userType := 2
- userName := "游客"
- if user != nil {
- userType, _ = strconv.Atoi(user.UserType)
- userName = user.NickName
- }
- // 日志格式
- logger.WithFields(logrus.Fields{
- "status_code": statusCode,
- "latency_time": latencyTime,
- "client_ip": clientIP,
- "req_method": reqMethod,
- "req_uri": reqUri,
- }).Info()
- log := model.SysOperLog{}
- log.Status = statusCode
- log.BusinessType = 1
- log.OperatorType = userType
- //log.Method = reqMethod
- log.RequestMethod = reqMethod
- log.OperName = userName
- log.OperIp = clientIP
- log.OperTime = time.Now()
- log.OperUrl = reqUri
- if statusCode == 200 {
- body := c.Writer.(*frame.BodyLogWriter).Body
- var rt resp.Response
- err := json.Unmarshal([]byte(body.String()), &rt)
- if err == nil {
- if rt.Status != 200 {
- log.ErrorMsg = rt.Msg
- }
- }
- }
- if gotool.StrUtils.HasNotEmpty(log.ErrorMsg) {
- v.LogService.Insert(&log)
- }
- //base.Clean()
- }
- }
- // 日志记录到 MongoDB
- func LoggerToMongo() gin.HandlerFunc {
- return func(c *gin.Context) {
- }
- }
- // 日志记录到 ES
- func LoggerToES() gin.HandlerFunc {
- return func(c *gin.Context) {
- }
- }
- // 日志记录到 MQ
- func LoggerToMQ() gin.HandlerFunc {
- return func(c *gin.Context) {
- }
- }
|