log.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 config 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() (log.Logger, error) {
  29. c := config.GinVueAdminconfig.Log
  30. logger := oplogging.MustGetLogger(module)
  31. var backends []oplogging.Backend
  32. backends = registerStdout(c, backends)
  33. backends = registerFile(c, backends)
  34. oplogging.SetBackend(backends...)
  35. log.SetLogger(logger)
  36. return logger, nil
  37. }
  38. func registerStdout(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
  39. for _, v := range c.Stdout {
  40. level, err := oplogging.LogLevel(v)
  41. if err != nil {
  42. fmt.Println(err)
  43. continue
  44. }
  45. backends = append(backends, createBackend(os.Stdout, c, level))
  46. }
  47. return backends
  48. }
  49. func registerFile(c config.Log, backends []oplogging.Backend) []oplogging.Backend {
  50. if len(c.File) > 0 {
  51. if ok, _ := tools.PathExists(logDir); !ok {
  52. // directory not exist
  53. fmt.Println("create log directory")
  54. _ = os.Mkdir(logDir, os.ModePerm)
  55. }
  56. apiLogPath := logDir + string(os.PathSeparator) + logSoftLink
  57. fileWriter, err := rotatelogs.New(
  58. apiLogPath+".%Y-%m-%d-%H-%M.log",
  59. // generate soft link, point to latest log file
  60. rotatelogs.WithLinkName(apiLogPath),
  61. // maximum time to save log files
  62. rotatelogs.WithMaxAge(7*24*time.Hour),
  63. // time period of log file switching
  64. rotatelogs.WithRotationTime(24*time.Hour),
  65. )
  66. if err != nil {
  67. fmt.Println(err)
  68. return backends
  69. }
  70. for _, v := range c.File {
  71. level, err := oplogging.LogLevel(v)
  72. if err != nil {
  73. fmt.Println(err)
  74. continue
  75. }
  76. backends = append(backends, createBackend(fileWriter, c, level))
  77. }
  78. }
  79. return backends
  80. }
  81. func createBackend(w io.Writer, c config.Log, level oplogging.Level) oplogging.Backend {
  82. backend := oplogging.NewLogBackend(w, c.Prefix, 0)
  83. stdoutWriter := false
  84. if w == os.Stdout {
  85. stdoutWriter = true
  86. }
  87. format := getLogFormatter(c, stdoutWriter)
  88. backendLeveled := oplogging.AddModuleLevel(oplogging.NewBackendFormatter(backend, format))
  89. backendLeveled.SetLevel(level, module)
  90. return backendLeveled
  91. }
  92. func getLogFormatter(c config.Log, stdoutWriter bool) oplogging.Formatter {
  93. pattern := defaultFormatter
  94. if !stdoutWriter {
  95. // Color is only required for console output
  96. // Other writers don't need %{color} tag
  97. pattern = strings.Replace(pattern, "%{color:bold}", "", -1)
  98. pattern = strings.Replace(pattern, "%{color:reset}", "", -1)
  99. }
  100. if !c.LogFile {
  101. // Remove %{logfile} tag
  102. pattern = strings.Replace(pattern, "%{longfile}", "", -1)
  103. }
  104. return oplogging.MustStringFormatter(pattern)
  105. }
  106. func (l Logger) Debug(v ...interface{}) {
  107. l.logger.Debug(v)
  108. }
  109. func (l Logger) Info(v ...interface{}) {
  110. l.logger.Info(v)
  111. }
  112. func (l Logger) Warning(v ...interface{}) {
  113. l.logger.Warning(v)
  114. }
  115. func (l Logger) Error(v ...interface{}) {
  116. l.logger.Error(v)
  117. }
  118. func (l Logger) Critical(v ...interface{}) {
  119. l.logger.Critical(v)
  120. }
  121. func (l Logger) Fatal(v ...interface{}) {
  122. l.logger.Fatal(v)
  123. }