loghelper.go 3.4 KB

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