log.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package base
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "path"
  7. "strings"
  8. "time"
  9. )
  10. const (
  11. LogLevelTrace = iota
  12. LogLevelDebug
  13. LogLevelInfo
  14. LogLevelWarn
  15. LogLevelError
  16. LogLevelFatal
  17. )
  18. var (
  19. baseLw *logWriter
  20. baseLog *log.Logger
  21. baseLevel int
  22. levels map[int]string
  23. dateFormat = "2006-01-02"
  24. logName = "anylink.log"
  25. )
  26. // 实现 os.Writer 接口
  27. type logWriter struct {
  28. UseStdout bool
  29. FileName string
  30. File *os.File
  31. NowDate string
  32. }
  33. // 实现日志文件的切割
  34. func (lw *logWriter) Write(p []byte) (n int, err error) {
  35. if !lw.UseStdout {
  36. return lw.File.Write(p)
  37. }
  38. date := time.Now().Format(dateFormat)
  39. if lw.NowDate != date {
  40. _ = lw.File.Close()
  41. _ = os.Rename(lw.FileName, lw.FileName+"."+lw.NowDate)
  42. lw.NowDate = date
  43. lw.newFile()
  44. }
  45. return lw.File.Write(p)
  46. }
  47. // 创建新文件
  48. func (lw *logWriter) newFile() {
  49. if lw.UseStdout {
  50. lw.File = os.Stdout
  51. return
  52. }
  53. f, err := os.OpenFile(lw.FileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  54. if err != nil {
  55. panic(err)
  56. }
  57. lw.File = f
  58. }
  59. func initLog() {
  60. // 初始化 baseLog
  61. baseLw = &logWriter{
  62. UseStdout: Cfg.LogPath == "",
  63. FileName: path.Join(Cfg.LogPath, logName),
  64. NowDate: time.Now().Format(dateFormat),
  65. }
  66. baseLw.newFile()
  67. baseLevel = logLevel2Int(Cfg.LogLevel)
  68. baseLog = log.New(baseLw, "", log.LstdFlags|log.Lshortfile)
  69. }
  70. func GetBaseLw() *logWriter {
  71. return baseLw
  72. }
  73. // 获取 log.Logger
  74. func GetBaseLog() *log.Logger {
  75. return baseLog
  76. }
  77. func GetLogLevel() int {
  78. return baseLevel
  79. }
  80. func logLevel2Int(l string) int {
  81. levels = map[int]string{
  82. LogLevelTrace: "Trace",
  83. LogLevelDebug: "Debug",
  84. LogLevelInfo: "Info",
  85. LogLevelWarn: "Warn",
  86. LogLevelError: "Error",
  87. LogLevelFatal: "Fatal",
  88. }
  89. lvl := LogLevelInfo
  90. for k, v := range levels {
  91. if strings.EqualFold(strings.ToLower(l), strings.ToLower(v)) {
  92. lvl = k
  93. }
  94. }
  95. return lvl
  96. }
  97. func output(l int, s ...interface{}) {
  98. lvl := fmt.Sprintf("[%s] ", levels[l])
  99. _ = baseLog.Output(3, lvl+fmt.Sprintln(s...))
  100. }
  101. func Trace(v ...interface{}) {
  102. l := LogLevelTrace
  103. if baseLevel > l {
  104. return
  105. }
  106. output(l, v...)
  107. }
  108. func Debug(v ...interface{}) {
  109. l := LogLevelDebug
  110. if baseLevel > l {
  111. return
  112. }
  113. output(l, v...)
  114. }
  115. func Info(v ...interface{}) {
  116. l := LogLevelInfo
  117. if baseLevel > l {
  118. return
  119. }
  120. output(l, v...)
  121. }
  122. func Warn(v ...interface{}) {
  123. l := LogLevelWarn
  124. if baseLevel > l {
  125. return
  126. }
  127. output(l, v...)
  128. }
  129. func Error(v ...interface{}) {
  130. l := LogLevelError
  131. if baseLevel > l {
  132. return
  133. }
  134. output(l, v...)
  135. }
  136. func Fatal(v ...interface{}) {
  137. l := LogLevelFatal
  138. if baseLevel > l {
  139. return
  140. }
  141. output(l, v...)
  142. os.Exit(1)
  143. }