log.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package core
  2. import (
  3. "eta_gn/eta_bridge/config"
  4. "eta_gn/eta_bridge/global"
  5. "eta_gn/eta_bridge/utils"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  9. oplogging "github.com/op/go-logging"
  10. "io"
  11. "os"
  12. "strings"
  13. "time"
  14. )
  15. const (
  16. Module = "eta_bridge"
  17. )
  18. var (
  19. defaultFormatter = ` %{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
  20. )
  21. func init() {
  22. logConfig := global.CONFIG.Log
  23. logger := oplogging.MustGetLogger(Module)
  24. var backends []oplogging.Backend
  25. registerStdout(logConfig, &backends)
  26. fileWriter := registerFile(logConfig, &backends, logConfig.LogDirPath, logConfig.LogSoftLink)
  27. if fileWriter != nil {
  28. if global.CONFIG.Serve.RunMode == "debug" {
  29. gin.DefaultWriter = io.MultiWriter(fileWriter, os.Stdout)
  30. } else {
  31. gin.DefaultWriter = io.MultiWriter(fileWriter)
  32. }
  33. }
  34. oplogging.SetBackend(backends...)
  35. global.LOG = logger
  36. initMysqlLog()
  37. initFileLog()
  38. }
  39. func initMysqlLog() {
  40. logConfig := global.CONFIG.Log
  41. var backends []oplogging.Backend
  42. registerStdout(logConfig, &backends)
  43. fileWriter := registerFile(logConfig, &backends, logConfig.BinlogDirPath, logConfig.BinlogSoftLink)
  44. global.MYSQL_LOG = fileWriter
  45. }
  46. func initFileLog() {
  47. logConfig := global.CONFIG.Log
  48. if logConfig.FilelogDirPath == "" || logConfig.FilelogSoftLink == `` {
  49. global.FILE_LOG = global.LOG
  50. return
  51. }
  52. logger := oplogging.MustGetLogger(Module)
  53. var backends []oplogging.Backend
  54. _ = registerFile(logConfig, &backends, logConfig.FilelogDirPath, logConfig.FilelogSoftLink)
  55. defaultBackend := oplogging.AddModuleLevel(backends[0])
  56. logger.SetBackend(defaultBackend)
  57. global.FILE_LOG = logger
  58. }
  59. func registerStdout(c config.Log, backends *[]oplogging.Backend) {
  60. if c.Stdout != "" {
  61. level, err := oplogging.LogLevel(c.Stdout)
  62. if err != nil {
  63. fmt.Println(err)
  64. }
  65. *backends = append(*backends, createBackend(os.Stdout, c, level))
  66. }
  67. }
  68. func registerFile(c config.Log, backends *[]oplogging.Backend, logDir, logSoftLink string) io.Writer {
  69. if c.FileStdout != "" {
  70. if ok, _ := utils.PathExists(logDir); !ok {
  71. fmt.Println("create log directory")
  72. _ = os.Mkdir(logDir, os.ModePerm)
  73. }
  74. saveMaxTime := time.Duration(global.CONFIG.Log.SaveMaxDay) * 24 * time.Hour
  75. cuttingTime := time.Duration(global.CONFIG.Log.CuttingDay) * 24 * time.Hour
  76. fileWriter, err := rotatelogs.New(
  77. logDir+string(os.PathSeparator)+"%Y-%m-%d-%H-%M.log",
  78. rotatelogs.WithLinkName(logSoftLink),
  79. rotatelogs.WithMaxAge(saveMaxTime), //日志保留多久,最小分钟为单位
  80. rotatelogs.WithRotationTime(cuttingTime), //rotate 最小为1分钟轮询。默认60s 低于1分钟就按1分钟来
  81. )
  82. if err != nil {
  83. fmt.Println(err)
  84. }
  85. level, err := oplogging.LogLevel(c.FileStdout)
  86. if err != nil {
  87. fmt.Println(err)
  88. }
  89. *backends = append(*backends, createBackend(fileWriter, c, level))
  90. return fileWriter
  91. }
  92. return nil
  93. }
  94. func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
  95. backend := oplogging.NewLogBackend(w, c.Prefix, 0)
  96. stdoutWriter := false
  97. if w == os.Stdout {
  98. stdoutWriter = true
  99. }
  100. format := getLogFormatter(c, stdoutWriter)
  101. backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
  102. backendLeveled.SetLevel(level, Module)
  103. return backendLeveled
  104. }
  105. func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
  106. pattern := defaultFormatter
  107. if !stdoutWriter {
  108. pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
  109. pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
  110. }
  111. if !c.LogFile {
  112. pattern = strings.Replace(pattern, "%{longfile}", "", -1)
  113. }
  114. return oplogging.MustStringFormatter(pattern)
  115. }