使用Go语言实现自动清理应用系统日志

发布于:2025-04-11 ⋅ 阅读:(26) ⋅ 点赞:(0)

在服务器上部署业务应用系统,每天都会产生大量的日志,随着时间的推移,日志越积累越多,占用了大量的磁盘空间,除了可以手动清理日志外,还可以通过程序实现自动清理日志。

之所以选择Go语言,是因为用Go写的代码可以直接编译成二进制可执行程序,不需要在服务器额外安装运行环境,相当于编译好的Go代码,直接丢到服务器就能执行。

全部代码如下:

//代码整体逻辑:每月第一天,自动清理上个月的日志文件
package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"time"
)

func main() {

    //日志文件夹路径
	var dirPath string = `C:\phpstudy_pro\WWW\notepad\runtime\log\` + getTime()
	flag, _ := dirIsEmpty(dirPath)
	if !flag {
		deleteFiles(dirPath)
	}
	delDir(dirPath)

}
//获取当前月的上一月的年月信息
func getTime() string {
	now := time.Now()
	lastYearAndMonth := now.AddDate(0, -1, 0).Format("200601")
	currentMonth := now.Month()
	if currentMonth == time.January {
		lastYear := now.Year() - 1
		lastYearAndMonth = time.Date(lastYear, time.December, 1, 0, 0, 0, 0, time.Local).Format("200601")

	}
	return lastYearAndMonth
}
//删除文件夹
func delDir(dirPath string) {
	_, err := os.Stat(dirPath)

	if !os.IsNotExist(err) {
		err = os.Remove(dirPath)
		if err == nil {
			fmt.Println("文件夹删除成功", dirPath)
		} else {
			fmt.Println("文件夹删除失败", dirPath)
		}
	} else {
		fmt.Println("文件夹不存在", dirPath)
	}
}
//判断文件夹是否有文件
func dirIsEmpty(path string) (bool, error) {
	f, err := os.Open(path)
	if err != nil {
		return false, err
	}
	defer f.Close()

	_, err = f.Readdir(1)
	if err == io.EOF {
		return true, nil // 文件夹为空
	}
	return false, err // 文件夹不为空或错误
}
//删除文件
func deleteFiles(path string) error {
	d, err := os.Open(path)
	if err != nil {
		return err
	}
	defer d.Close()

	files, err := d.Readdir(-1)
	if err != nil {
		return err
	}

	for _, file := range files {
		filename := filepath.Join(path, file.Name())

		err = os.Remove(filename) // 删除文件
		if err != nil {
			fmt.Println("Error deleting file: ", err)
		}

	}
	return nil
}

因为使用的服务器是Windows Server,所以将上面的Go代码编译成exe文件后加入到Windows系统里的计划任务里,设置每月第一天执行一次。


网站公告

今日签到

点亮在社区的每一天
去签到