loghelper.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package log_helper
  2. import (
  3. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  4. "github.com/sirupsen/logrus"
  5. easy "github.com/t-tomalak/logrus-easy-formatter"
  6. "io"
  7. "os"
  8. "path/filepath"
  9. "sync"
  10. "time"
  11. )
  12. func NewLogHelper(appName string, level logrus.Level, maxAge time.Duration, rotationTime time.Duration) *logrus.Logger {
  13. Logger := &logrus.Logger{
  14. // Out: os.Stderr,
  15. // Level: logrus.DebugLevel,
  16. Formatter: &easy.Formatter{
  17. TimestampFormat: "2006-01-02 15:04:05",
  18. LogFormat: "[%lvl%]: %time% - %msg%\n",
  19. },
  20. }
  21. nowPath, err := os.Getwd()
  22. if err != nil {
  23. panic(err)
  24. }
  25. pathRoot := filepath.Join(nowPath, "Logs")
  26. fileAbsPath := filepath.Join(pathRoot, appName+".log")
  27. // 下面配置日志每隔 X 分钟轮转一个新文件,保留最近 X 分钟的日志文件,多余的自动清理掉。
  28. writer, _ := rotatelogs.New(
  29. filepath.Join(pathRoot, appName+"--%YLen%m%d%H%M--.log"),
  30. rotatelogs.WithLinkName(fileAbsPath),
  31. rotatelogs.WithMaxAge(maxAge),
  32. rotatelogs.WithRotationTime(rotationTime),
  33. )
  34. Logger.SetLevel(level)
  35. Logger.SetOutput(io.MultiWriter(os.Stderr, writer))
  36. return Logger
  37. }
  38. // SetLoggerName 如果是 ChineseSubFinder 调用则无需使用,其他子程序用的时候,为了区分日子名称,需要设置
  39. func SetLoggerName(logName string) {
  40. if logName == "" {
  41. panic("Need Set Logger Name")
  42. }
  43. logNameBase = logName
  44. }
  45. func GetLogger() *logrus.Logger {
  46. oneBase.Do(func() {
  47. var level logrus.Level
  48. // 之前是读取配置文件,现在改为,读取当前目录下,是否有一个特殊的文件,有则启动 Debug 日志级别
  49. // 那么怎么写入这个文件,就靠额外的逻辑控制了
  50. if isFile(DebugFileName) == true {
  51. level = logrus.DebugLevel
  52. } else {
  53. level = logrus.InfoLevel
  54. }
  55. if logNameBase == "" {
  56. // 默认不设置的时候就是这个
  57. logNameBase = LogNameChineseSubFinder
  58. }
  59. loggerBase = NewLogHelper(logNameBase, level, time.Duration(7*24)*time.Hour, time.Duration(24)*time.Hour)
  60. })
  61. return loggerBase
  62. }
  63. func isFile(filePath string) bool {
  64. s, err := os.Stat(filePath)
  65. if err != nil {
  66. return false
  67. }
  68. return !s.IsDir()
  69. }
  70. // WriteDebugFile 写入开启 Debug 级别日志记录的特殊文件,注意这个最好是在主程序中调用,这样就跟主程序在一个目录下生成,log 去检测是否存在才有意义
  71. func WriteDebugFile() error {
  72. if isFile(DebugFileName) == true {
  73. return nil
  74. }
  75. f, err := os.Create(DebugFileName)
  76. defer func() {
  77. _ = f.Close()
  78. }()
  79. if err != nil {
  80. return err
  81. }
  82. return nil
  83. }
  84. // DeleteDebugFile 删除开启 Debug 级别日志记录的特殊文件
  85. func DeleteDebugFile() error {
  86. if isFile(DebugFileName) == false {
  87. return nil
  88. }
  89. err := os.Remove(DebugFileName)
  90. if err != nil {
  91. return err
  92. }
  93. return nil
  94. }
  95. const DebugFileName = "opendebuglog"
  96. const (
  97. LogNameChineseSubFinder = "ChineseSubFinder"
  98. LogNameGetCAPTCHA = "GetCAPTCHA"
  99. LogNameBackEnd = "BackEnd"
  100. )
  101. var (
  102. logNameBase = ""
  103. oneBase = sync.Once{}
  104. loggerBase *logrus.Logger
  105. )