logger.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package logger
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/druidcaesa/gotool"
  6. "github.com/gin-gonic/gin"
  7. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  8. "github.com/rifflock/lfshook"
  9. "github.com/sirupsen/logrus"
  10. "os"
  11. "path"
  12. "strconv"
  13. "time"
  14. "ulink-admin/config"
  15. "ulink-admin/frame"
  16. "ulink-admin/modules/system/models/model"
  17. "ulink-admin/modules/system/service"
  18. "ulink-admin/pkg/jwt/admin"
  19. "ulink-admin/pkg/resp"
  20. )
  21. type Logger struct {
  22. LogService *service.SysOperLogService `inject:""`
  23. }
  24. func NewLogger() *Logger {
  25. return &Logger{}
  26. }
  27. // 日志记录到文件
  28. func (v *Logger) LoggerToFile() func(c *frame.Context) {
  29. logFilePath := config.GetLoggerCfg().LogPath
  30. logFileName := config.GetLoggerCfg().LogName
  31. // 日志文件
  32. fileName := path.Join(logFilePath, logFileName)
  33. if !gotool.FileUtils.Exists(fileName) {
  34. create, err := os.Create(fileName)
  35. if err != nil {
  36. gotool.Logs.ErrorLog().Println(err)
  37. }
  38. defer create.Close()
  39. //gotool.FileUtils.Create(fileName)
  40. }
  41. // 写入文件
  42. src, err := os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
  43. if err != nil {
  44. fmt.Println("err", err)
  45. }
  46. // 实例化
  47. logger := logrus.New()
  48. // 设置输出
  49. logger.Out = src
  50. // 设置日志级别
  51. logger.SetLevel(logrus.DebugLevel)
  52. // 设置 rotatelogs
  53. logWriter, err := rotatelogs.New(
  54. // 分割后的文件名称
  55. fileName+".%Y%m%d.log",
  56. // 生成软链,指向最新日志文件
  57. rotatelogs.WithLinkName(fileName),
  58. // 设置最大保存时间(7天)
  59. rotatelogs.WithMaxAge(7*24*time.Hour),
  60. // 设置日志切割时间间隔(1天)
  61. rotatelogs.WithRotationTime(24*time.Hour),
  62. )
  63. writeMap := lfshook.WriterMap{
  64. logrus.InfoLevel: logWriter,
  65. logrus.FatalLevel: logWriter,
  66. logrus.DebugLevel: logWriter,
  67. logrus.WarnLevel: logWriter,
  68. logrus.ErrorLevel: logWriter,
  69. logrus.PanicLevel: logWriter,
  70. }
  71. lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{
  72. TimestampFormat: "2006-01-02 15:04:05",
  73. })
  74. // 新增 Hook
  75. logger.AddHook(lfHook)
  76. return func(c *frame.Context) {
  77. c.Get("permission")
  78. // 开始时间
  79. startTime := time.Now()
  80. // 处理请求
  81. c.Next()
  82. // 结束时间
  83. endTime := time.Now()
  84. // 执行时间
  85. latencyTime := endTime.Sub(startTime)
  86. // 请求方式
  87. reqMethod := c.Request.Method
  88. // 请求路由
  89. reqUri := c.Request.RequestURI
  90. // 状态码
  91. statusCode := c.Writer.Status()
  92. // 请求IP
  93. clientIP := c.ClientIP()
  94. user := admin.GetUserInfo(c)
  95. userType := 2
  96. userName := "游客"
  97. if user != nil {
  98. userType, _ = strconv.Atoi(user.UserType)
  99. userName = user.NickName
  100. }
  101. // 日志格式
  102. logger.WithFields(logrus.Fields{
  103. "status_code": statusCode,
  104. "latency_time": latencyTime,
  105. "client_ip": clientIP,
  106. "req_method": reqMethod,
  107. "req_uri": reqUri,
  108. }).Info()
  109. log := model.SysOperLog{}
  110. log.Status = statusCode
  111. log.BusinessType = 1
  112. log.OperatorType = userType
  113. //log.Method = reqMethod
  114. log.RequestMethod = reqMethod
  115. log.OperName = userName
  116. log.OperIp = clientIP
  117. log.OperTime = time.Now()
  118. log.OperUrl = reqUri
  119. if statusCode == 200 {
  120. body := c.Writer.(*frame.BodyLogWriter).Body
  121. var rt resp.Response
  122. err := json.Unmarshal([]byte(body.String()), &rt)
  123. if err == nil {
  124. if rt.Status != 200 {
  125. log.ErrorMsg = rt.Msg
  126. }
  127. }
  128. }
  129. if gotool.StrUtils.HasNotEmpty(log.ErrorMsg) {
  130. v.LogService.Insert(&log)
  131. }
  132. //base.Clean()
  133. }
  134. }
  135. // 日志记录到 MongoDB
  136. func LoggerToMongo() gin.HandlerFunc {
  137. return func(c *gin.Context) {
  138. }
  139. }
  140. // 日志记录到 ES
  141. func LoggerToES() gin.HandlerFunc {
  142. return func(c *gin.Context) {
  143. }
  144. }
  145. // 日志记录到 MQ
  146. func LoggerToMQ() gin.HandlerFunc {
  147. return func(c *gin.Context) {
  148. }
  149. }