log.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package core
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  6. oplogging "github.com/op/go-logging"
  7. "hongze/hongze_yb/config"
  8. "hongze/hongze_yb/global"
  9. "hongze/hongze_yb/utils"
  10. "io"
  11. "os"
  12. "strings"
  13. "time"
  14. )
  15. const (
  16. Module = "hongze_yb"
  17. )
  18. var (
  19. defaultFormatter = ` %{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
  20. )
  21. // 初始化日志
  22. func init() {
  23. logConfig := global.CONFIG.Log
  24. logger := oplogging.MustGetLogger(Module)
  25. var backends []oplogging.Backend
  26. //注册输出
  27. registerStdout(logConfig, &backends)
  28. //注册框架输出(日志文件)
  29. fileWriter := registerFile(logConfig, &backends, logConfig.LogDirPath, logConfig.LogSoftLink)
  30. if fileWriter != nil {
  31. if global.CONFIG.Serve.RunMode == "debug" {
  32. gin.DefaultWriter = io.MultiWriter(fileWriter, os.Stdout)
  33. } else {
  34. gin.DefaultWriter = io.MultiWriter(fileWriter)
  35. }
  36. }
  37. oplogging.SetBackend(backends...)
  38. global.LOG = logger
  39. //初始化mysql数据库日志
  40. initMysqlLog()
  41. // 初始化自定义输出的日志
  42. initFileLog()
  43. // 初始化mongo输出的日志
  44. initMongoLog()
  45. }
  46. // initMysqlLog 初始化mysql数据库日志
  47. func initMysqlLog() {
  48. logConfig := global.CONFIG.Log
  49. var backends []oplogging.Backend
  50. //注册输出
  51. registerStdout(logConfig, &backends)
  52. //注册框架输出(日志文件)
  53. fileWriter := registerFile(logConfig, &backends, logConfig.BinlogDirPath, logConfig.BinlogSoftLink)
  54. global.MYSQL_LOG = fileWriter
  55. }
  56. // initFileLog 初始化自定义日志
  57. func initFileLog() {
  58. logConfig := global.CONFIG.Log
  59. // 没有单独配置的话,那就走默认的日志输出
  60. if logConfig.FilelogDirPath == "" || logConfig.FilelogSoftLink == `` {
  61. global.FILE_LOG = global.LOG
  62. return
  63. }
  64. logger := oplogging.MustGetLogger(Module)
  65. var backends []oplogging.Backend
  66. //注册控制台输出
  67. //registerStdout(logConfig, &backends)
  68. // 注册文件输出(日志文件)
  69. _ = registerFile(logConfig, &backends, logConfig.FilelogDirPath, logConfig.FilelogSoftLink)
  70. defaultBackend := oplogging.AddModuleLevel(backends[0])
  71. logger.SetBackend(defaultBackend)
  72. global.FILE_LOG = logger
  73. }
  74. // initFileLog 初始化mongo日志
  75. func initMongoLog() {
  76. logConfig := global.CONFIG.Log
  77. // 没有单独配置的话,那就走默认的日志输出
  78. if logConfig.MongologDirPath == "" || logConfig.MongologSoftLink == `` {
  79. global.MONGO_LOG = global.LOG
  80. return
  81. }
  82. logger := oplogging.MustGetLogger(Module)
  83. var backends []oplogging.Backend
  84. //注册控制台输出
  85. //registerStdout(logConfig, &backends)
  86. // 注册文件输出(日志文件)
  87. _ = registerFile(logConfig, &backends, logConfig.MongologDirPath, logConfig.MongologSoftLink)
  88. defaultBackend := oplogging.AddModuleLevel(backends[0])
  89. logger.SetBackend(defaultBackend)
  90. global.MONGO_LOG = logger
  91. }
  92. func registerStdout(c config.Log, backends *[]oplogging.Backend) {
  93. if c.Stdout != "" {
  94. level, err := oplogging.LogLevel(c.Stdout)
  95. if err != nil {
  96. fmt.Println(err)
  97. }
  98. *backends = append(*backends, createBackend(os.Stdout, c, level))
  99. }
  100. }
  101. // registerFile 注册文件日志
  102. func registerFile(c config.Log, backends *[]oplogging.Backend, logDir, logSoftLink string) io.Writer {
  103. if c.FileStdout != "" {
  104. if ok, _ := utils.PathExists(logDir); !ok {
  105. // directory not exist
  106. fmt.Println("create log directory")
  107. _ = os.Mkdir(logDir, os.ModePerm)
  108. }
  109. //日志保留时间
  110. saveMaxTime := time.Duration(global.CONFIG.Log.SaveMaxDay) * 24 * time.Hour
  111. //日志切割时间(每隔多久切割一次)
  112. cuttingTime := time.Duration(global.CONFIG.Log.CuttingDay) * 24 * time.Hour
  113. //使用rotatelogs
  114. fileWriter, err := rotatelogs.New(
  115. logDir+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
  116. // 生成软链,指向最新日志文件
  117. rotatelogs.WithLinkName(logSoftLink),
  118. // 以下两个配置不能同时设置,一个是保留天数,一个是保留分拣份数
  119. rotatelogs.WithMaxAge(saveMaxTime), //日志保留多久,最小分钟为单位
  120. //rotatelogs.WithRotationCount(5), //number 默认7份 大于7份 或到了清理时间 开始清理
  121. // time period of log file switching
  122. rotatelogs.WithRotationTime(cuttingTime), //rotate 最小为1分钟轮询。默认60s 低于1分钟就按1分钟来
  123. )
  124. if err != nil {
  125. fmt.Println(err)
  126. }
  127. level, err := oplogging.LogLevel(c.FileStdout)
  128. if err != nil {
  129. fmt.Println(err)
  130. }
  131. *backends = append(*backends, createBackend(fileWriter, c, level))
  132. return fileWriter
  133. }
  134. return nil
  135. }
  136. // createBackend 创建一个新的日志记录器
  137. func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
  138. backend := oplogging.NewLogBackend(w, c.Prefix, 0)
  139. stdoutWriter := false
  140. if w == os.Stdout {
  141. stdoutWriter = true
  142. }
  143. format := getLogFormatter(c, stdoutWriter)
  144. backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
  145. backendLeveled.SetLevel(level, Module)
  146. return backendLeveled
  147. }
  148. func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
  149. pattern := defaultFormatter
  150. if !stdoutWriter {
  151. // Color is only required for console output
  152. // Other writers don't need %{color} tag
  153. pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
  154. pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
  155. }
  156. if !c.LogFile {
  157. // Remove %{logfile} tag
  158. pattern = strings.Replace(pattern, "%{longfile}", "", -1)
  159. }
  160. return oplogging.MustStringFormatter(pattern)
  161. }