|
@@ -0,0 +1,70 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+
|
|
|
+ "github.com/fsnotify/fsnotify"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ maxSize = 500 * 1024 * 1024 // 500MB
|
|
|
+ logDir = "/var/log"
|
|
|
+)
|
|
|
+
|
|
|
+func checkAndTruncate(filePath string) {
|
|
|
+ fileInfo, err := os.Stat(filePath)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("获取文件信息失败 %s: %v", filePath, err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if fileInfo.Size() > maxSize {
|
|
|
+ err := os.Truncate(filePath, 0)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("截断文件失败 %s: %v", filePath, err)
|
|
|
+ } else {
|
|
|
+ log.Printf("成功截断文件 %s", filePath)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ // 初始检查所有文件
|
|
|
+ files, err := os.ReadDir(logDir)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("读取日志目录失败: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, file := range files {
|
|
|
+ if file.IsDir() {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ checkAndTruncate(filepath.Join(logDir, file.Name()))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建文件监控
|
|
|
+ watcher, err := fsnotify.NewWatcher()
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("创建文件监控失败: %v", err)
|
|
|
+ }
|
|
|
+ defer watcher.Close()
|
|
|
+
|
|
|
+ err = watcher.Add(logDir)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalf("添加监控目录失败: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Println("开始监控日志目录", logDir)
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case event := <-watcher.Events:
|
|
|
+ if event.Op&fsnotify.Write == fsnotify.Write {
|
|
|
+ checkAndTruncate(event.Name)
|
|
|
+ }
|
|
|
+ case err := <-watcher.Errors:
|
|
|
+ log.Printf("监控错误: %v", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|