在服务器上部署业务应用系统,每天都会产生大量的日志,随着时间的推移,日志越积累越多,占用了大量的磁盘空间,除了可以手动清理日志外,还可以通过程序实现自动清理日志。
之所以选择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系统里的计划任务里,设置每月第一天执行一次。