You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
3.4 KiB

  1. package qmlog
  2. // Register logger
  3. import (
  4. "errors"
  5. "fmt"
  6. "gin-vue-admin/config"
  7. "gin-vue-admin/init/initlog"
  8. "gin-vue-admin/tools"
  9. rotatelogs "github.com/lestrrat/go-file-rotatelogs"
  10. oplogging "github.com/op/go-logging"
  11. "io"
  12. "os"
  13. "strings"
  14. "time"
  15. )
  16. const (
  17. logDir = "log"
  18. logSoftLink = "api.log"
  19. module = "gin-vue-admin"
  20. )
  21. var (
  22. configNotFound = errors.New("logger prefix not found")
  23. defaultFormatter = `%{time:2006/01/02 - 15:04:05.000} %{longfile} %{color:bold}▶ [%{level:.6s}] %{message}%{color:reset}`
  24. )
  25. type Logger struct{
  26. logger *oplogging.Logger
  27. }
  28. func NewLogger() error {
  29. c := config.GinVueAdminconfig.Log
  30. if c.Prefix == "" {
  31. return configNotFound
  32. }
  33. logger := oplogging.MustGetLogger(module)
  34. var backends []oplogging.Backend
  35. backends = registerStdout(c, backends)
  36. backends = registerFile(c, backends)
  37. oplogging.SetBackend(backends...)
  38. log.SetLogger(logger)
  39. return nil
  40. }
  41. func registerStdout(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
  42. for _, v := range c.Stdout {
  43. level, err := oplogging.LogLevel(v)
  44. if err != nil {
  45. fmt.Println(err)
  46. continue
  47. }
  48. backends = append(backends, createBackend(os.Stdout, c, level))
  49. }
  50. return backends
  51. }
  52. func registerFile(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
  53. if len(c.File) > 0 {
  54. if ok, _ := tools.PathExists(logDir); !ok {
  55. // directory not exist
  56. fmt.Println("create log directory")
  57. _ = os.Mkdir(logDir, os.ModePerm)
  58. }
  59. apiLogPath := logDir + string(os.PathSeparator) + logSoftLink
  60. fileWriter, err := rotatelogs.New(
  61. apiLogPath+".%Y-%m-%d-%H-%M.log",
  62. // generate soft link, point to latest log file
  63. rotatelogs.WithLinkName(apiLogPath),
  64. // maximum time to save log files
  65. rotatelogs.WithMaxAge(7*24*time.Hour),
  66. // time period of log file switching
  67. rotatelogs.WithRotationTime(24*time.Hour),
  68. )
  69. if err != nil {
  70. fmt.Println(err)
  71. return backends
  72. }
  73. for _, v := range c.File {
  74. level, err := oplogging.LogLevel(v)
  75. if err != nil {
  76. fmt.Println(err)
  77. continue
  78. }
  79. backends = append(backends, createBackend(fileWriter, c, level))
  80. }
  81. }
  82. return backends
  83. }
  84. func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
  85. backend := oplogging.NewLogBackend(w, c.Prefix, 0)
  86. stdoutWriter := false
  87. if w == os.Stdout {
  88. stdoutWriter = true
  89. }
  90. format := getLogFormatter(c, stdoutWriter)
  91. backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
  92. backendLeveled.SetLevel(level, module)
  93. return backendLeveled
  94. }
  95. func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
  96. pattern := defaultFormatter
  97. if !stdoutWriter {
  98. // Color is only required for console output
  99. // Other writers don't need %{color} tag
  100. pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
  101. pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
  102. }
  103. if !c.LogFile {
  104. // Remove %{logfile} tag
  105. pattern = strings.Replace(pattern, "%{longfile}", "", -1)
  106. }
  107. return oplogging.MustStringFormatter(pattern)
  108. }
  109. func (l Logger) Debug(v ...interface{}) {
  110. l.logger.Debug(v)
  111. }
  112. func (l Logger) Info(v ...interface{}) {
  113. l.logger.Info(v)
  114. }
  115. func (l Logger) Warning(v ...interface{}) {
  116. l.logger.Warning(v)
  117. }
  118. func (l Logger) Error(v ...interface{}) {
  119. l.logger.Error(v)
  120. }
  121. func (l Logger) Critical(v ...interface{}) {
  122. l.logger.Critical(v)
  123. }
  124. func (l Logger) Fatal(v ...interface{}) {
  125. l.logger.Fatal(v)
  126. }