log.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package pairec
  2. import (
  3. "flag"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "sort"
  9. "time"
  10. "gitlab.alibaba-inc.com/pai_biz_arch/pairec/recconf"
  11. )
  12. const (
  13. LOG_DEBUG = "DEBUG"
  14. LOG_INFO = "INFO"
  15. LOG_ERROR = "ERROR"
  16. LOG_FATAL = "FATAL"
  17. LOG_OUTPUT_CONSOLE = "console"
  18. )
  19. var logDir string
  20. func ClearDir(config recconf.LogConfig) {
  21. if config.LogLevel == LOG_DEBUG {
  22. flag.Set("v", "1")
  23. }
  24. if config.Output == LOG_OUTPUT_CONSOLE {
  25. flag.Set("logtostderr", "true")
  26. }
  27. if f := flag.Lookup("log_dir"); f != nil {
  28. logDir = f.Value.String()
  29. }
  30. if logDir != "" {
  31. go clearLoop(config)
  32. }
  33. }
  34. type fileInfo struct {
  35. file os.FileInfo
  36. delete bool
  37. }
  38. type fileInfoSlice []*fileInfo
  39. func (us fileInfoSlice) Len() int {
  40. return len(us)
  41. }
  42. func (us fileInfoSlice) Less(i, j int) bool {
  43. return us[i].file.ModTime().Unix() < us[j].file.ModTime().Unix()
  44. }
  45. func (us fileInfoSlice) Swap(i, j int) {
  46. tmp := us[i]
  47. us[i] = us[j]
  48. us[j] = tmp
  49. }
  50. func clearLoop(config recconf.LogConfig) {
  51. fileInfoList := make([]*fileInfo, 0)
  52. for {
  53. fileInfoList = fileInfoList[:0]
  54. fileInfos, err := ioutil.ReadDir(logDir)
  55. if err != nil {
  56. fmt.Println(err)
  57. continue
  58. }
  59. pointTime := time.Now().Unix() - int64(config.RetensionDays*86400)
  60. totalSize := int64(0)
  61. for _, file := range fileInfos {
  62. if file.ModTime().Unix() < pointTime {
  63. path := filepath.Join(logDir, file.Name())
  64. err := os.Remove(path)
  65. if err != nil {
  66. fmt.Println(err)
  67. }
  68. continue
  69. }
  70. // omit symlink file
  71. if file.Mode() == os.ModeSymlink {
  72. continue
  73. }
  74. totalSize += file.Size()
  75. info := &fileInfo{
  76. delete: false,
  77. file: file,
  78. }
  79. fileInfoList = append(fileInfoList, info)
  80. }
  81. sizeThreshold := int64(float64(config.DiskSize*1024*1024*1024) * 0.8)
  82. // sizeThreshold := int64(0)
  83. if totalSize > sizeThreshold {
  84. sort.Sort(fileInfoSlice(fileInfoList))
  85. for _, info := range fileInfoList {
  86. info.delete = true
  87. totalSize -= info.file.Size()
  88. if totalSize < sizeThreshold {
  89. break
  90. }
  91. }
  92. for _, info := range fileInfoList {
  93. if info.delete {
  94. path := filepath.Join(logDir, info.file.Name())
  95. err := os.Remove(path)
  96. if err != nil {
  97. fmt.Println(err)
  98. }
  99. }
  100. }
  101. }
  102. time.Sleep(10 * time.Second)
  103. }
  104. }