loghelper.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package log_helper
  2. import (
  3. "io"
  4. "os"
  5. "path/filepath"
  6. "time"
  7. "github.com/ChineseSubFinder/ChineseSubFinder/pkg"
  8. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/settings"
  9. "github.com/ChineseSubFinder/ChineseSubFinder/pkg/extend_log"
  10. rotatelogs "github.com/lestrrat-go/file-rotatelogs"
  11. "github.com/sirupsen/logrus"
  12. easy "github.com/t-tomalak/logrus-easy-formatter"
  13. )
  14. func NewLogHelper(appName string, logStorePath string, level logrus.Level, maxAge time.Duration, rotationTime time.Duration, extendLog ...settings.ExtendLog) *logrus.Logger {
  15. Logger := logrus.New()
  16. Logger.Formatter = &easy.Formatter{
  17. TimestampFormat: "2006-01-02 15:04:05",
  18. LogFormat: "[%lvl%]: %time% - %msg%\n",
  19. }
  20. pathRoot := filepath.Join(logStorePath, "Logs")
  21. fileAbsPath := filepath.Join(pathRoot, appName+".log")
  22. // 下面配置日志每隔 X 分钟轮转一个新文件,保留最近 X 分钟的日志文件,多余的自动清理掉。
  23. writer, _ := rotatelogs.New(
  24. filepath.Join(pathRoot, appName+"--%Y%m%d%H%M--.log"),
  25. rotatelogs.WithLinkName(fileAbsPath),
  26. rotatelogs.WithMaxAge(maxAge),
  27. rotatelogs.WithRotationTime(rotationTime),
  28. )
  29. Logger.SetLevel(level)
  30. Logger.SetOutput(io.MultiWriter(os.Stderr, writer))
  31. if len(extendLog) > 0 {
  32. exLog := extend_log.ExtendLogEx{}
  33. exLog.AddHook(Logger, extendLog[0])
  34. }
  35. // 可以输出函数调用还文件位置
  36. //if level == logrus.DebugLevel {
  37. // Logger.SetReportCaller(true)
  38. //}
  39. return Logger
  40. }
  41. func isFile(filePath string) bool {
  42. s, err := os.Stat(filePath)
  43. if err != nil {
  44. return false
  45. }
  46. return !s.IsDir()
  47. }
  48. // WriteDebugFile 写入开启 Debug 级别日志记录的特殊文件,注意这个最好是在主程序中调用,这样就跟主程序在一个目录下生成,log 去检测是否存在才有意义
  49. func WriteDebugFile() error {
  50. if isFile(filepath.Join(pkg.ConfigRootDirFPath(), DebugFileName)) == true {
  51. return nil
  52. }
  53. f, err := os.Create(filepath.Join(pkg.ConfigRootDirFPath(), DebugFileName))
  54. defer func() {
  55. _ = f.Close()
  56. }()
  57. if err != nil {
  58. return err
  59. }
  60. return nil
  61. }
  62. // DeleteDebugFile 删除开启 Debug 级别日志记录的特殊文件
  63. func DeleteDebugFile() error {
  64. if isFile(filepath.Join(pkg.ConfigRootDirFPath(), DebugFileName)) == false {
  65. return nil
  66. }
  67. err := os.Remove(filepath.Join(pkg.ConfigRootDirFPath(), DebugFileName))
  68. if err != nil {
  69. return err
  70. }
  71. return nil
  72. }
  73. func GetLogger4Tester() *logrus.Logger {
  74. if logger4Tester == nil {
  75. logger4Tester = NewLogHelper(LogNameChineseSubFinder, os.TempDir(), logrus.DebugLevel, time.Duration(7*24)*time.Hour, time.Duration(24)*time.Hour)
  76. }
  77. return logger4Tester
  78. }
  79. const DebugFileName = "opendebuglog"
  80. const (
  81. LogNameChineseSubFinder = "ChineseSubFinder"
  82. LogNameGetCAPTCHA = "GetCAPTCHA"
  83. LogNameBackEnd = "BackEnd"
  84. LogNameCliSubTimelineFixer = "SubTimelineFixer"
  85. )
  86. var (
  87. logger4Tester *logrus.Logger
  88. )