log.go 3.3 KB

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