log.go 2.3 KB

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