main.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "path/filepath"
  6. "github.com/fsnotify/fsnotify"
  7. )
  8. const (
  9. maxSize = 500 * 1024 * 1024 // 500MB
  10. logDir = "/var/log"
  11. )
  12. func checkAndTruncate(filePath string) {
  13. fileInfo, err := os.Stat(filePath)
  14. if err != nil {
  15. log.Printf("获取文件信息失败 %s: %v", filePath, err)
  16. return
  17. }
  18. if fileInfo.Size() > maxSize {
  19. err := os.Truncate(filePath, 0)
  20. if err != nil {
  21. log.Printf("截断文件失败 %s: %v", filePath, err)
  22. } else {
  23. log.Printf("成功截断文件 %s", filePath)
  24. }
  25. }
  26. }
  27. func main() {
  28. // 初始检查所有文件
  29. files, err := os.ReadDir(logDir)
  30. if err != nil {
  31. log.Fatalf("读取日志目录失败: %v", err)
  32. }
  33. for _, file := range files {
  34. if file.IsDir() {
  35. continue
  36. }
  37. checkAndTruncate(filepath.Join(logDir, file.Name()))
  38. }
  39. // 创建文件监控
  40. watcher, err := fsnotify.NewWatcher()
  41. if err != nil {
  42. log.Fatalf("创建文件监控失败: %v", err)
  43. }
  44. defer watcher.Close()
  45. err = watcher.Add(logDir)
  46. if err != nil {
  47. log.Fatalf("添加监控目录失败: %v", err)
  48. }
  49. log.Println("开始监控日志目录", logDir)
  50. for {
  51. select {
  52. case event := <-watcher.Events:
  53. if event.Op&fsnotify.Write == fsnotify.Write {
  54. checkAndTruncate(event.Name)
  55. }
  56. case err := <-watcher.Errors:
  57. log.Printf("监控错误: %v", err)
  58. }
  59. }
  60. }