log.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. logDir = "log"
  17. logSoftLink = "latest_log"
  18. module = "hongze_yb"
  19. )
  20. var (
  21. defaultFormatter = ` %{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
  22. )
  23. func init() {
  24. logConfig := global.CONFIG.Log
  25. logger := oplogging.MustGetLogger(module)
  26. var backends []oplogging.Backend
  27. //注册输出
  28. registerStdout(logConfig, &backends)
  29. //注册框架输出(日志文件)
  30. fileWriter := registerFile(logConfig, &backends)
  31. if fileWriter != nil {
  32. if global.CONFIG.Serve.RunMode == "debug" {
  33. gin.DefaultWriter = io.MultiWriter(fileWriter, os.Stdout)
  34. } else {
  35. gin.DefaultWriter = io.MultiWriter(fileWriter)
  36. }
  37. }
  38. oplogging.SetBackend(backends...)
  39. global.LOG = logger
  40. }
  41. func registerStdout(c config.Log, backends *[]oplogging.Backend) {
  42. if c.Stdout != "" {
  43. level, err := oplogging.LogLevel(c.Stdout)
  44. if err != nil {
  45. fmt.Println(err)
  46. }
  47. *backends = append(*backends, createBackend(os.Stdout, c, level))
  48. }
  49. }
  50. // registerFile 注册文件日志
  51. func registerFile(c config.Log, backends *[]oplogging.Backend) io.Writer {
  52. if c.File != "" {
  53. if ok, _ := utils.PathExists(logDir); !ok {
  54. // directory not exist
  55. fmt.Println("create log directory")
  56. _ = os.Mkdir(logDir, os.ModePerm)
  57. }
  58. //日志保留时间
  59. saveMaxTime := time.Duration(global.CONFIG.Log.SaveMaxDay) * 24 * time.Hour
  60. //日志切割时间(每隔多久切割一次)
  61. cuttingTime := time.Duration(global.CONFIG.Log.CuttingDay) * 24 * time.Hour
  62. //使用rotatelogs
  63. fileWriter, err := rotatelogs.New(
  64. logDir+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
  65. // 生成软链,指向最新日志文件
  66. rotatelogs.WithLinkName(logSoftLink),
  67. // 以下两个配置不能同时设置,一个是保留天数,一个是保留分拣份数
  68. rotatelogs.WithMaxAge(saveMaxTime), //日志保留多久,最小分钟为单位
  69. //rotatelogs.WithRotationCount(5), //number 默认7份 大于7份 或到了清理时间 开始清理
  70. // time period of log file switching
  71. rotatelogs.WithRotationTime(cuttingTime), //rotate 最小为1分钟轮询。默认60s 低于1分钟就按1分钟来
  72. )
  73. if err != nil {
  74. fmt.Println(err)
  75. }
  76. level, err := oplogging.LogLevel(c.File)
  77. if err != nil {
  78. fmt.Println(err)
  79. }
  80. *backends = append(*backends, createBackend(fileWriter, c, level))
  81. return fileWriter
  82. }
  83. return nil
  84. }
  85. // createBackend 创建一个新的日志记录器
  86. func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
  87. backend := oplogging.NewLogBackend(w, c.Prefix, 0)
  88. stdoutWriter := false
  89. if w == os.Stdout {
  90. stdoutWriter = true
  91. }
  92. format := getLogFormatter(c, stdoutWriter)
  93. backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
  94. backendLeveled.SetLevel(level, module)
  95. return backendLeveled
  96. }
  97. func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
  98. pattern := defaultFormatter
  99. if !stdoutWriter {
  100. // Color is only required for console output
  101. // Other writers don't need %{color} tag
  102. pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
  103. pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
  104. }
  105. if !c.LogFile {
  106. // Remove %{logfile} tag
  107. pattern = strings.Replace(pattern, "%{longfile}", "", -1)
  108. }
  109. return oplogging.MustStringFormatter(pattern)
  110. }