在 Linux 系统下,Golang 日志清理可以通过以下几种方法实现:
许多 Golang 日志库都提供了内置的日志轮转和清理功能。例如,logrus 和 zap 这两个流行的日志库都支持日志轮转。你可以根据库的文档配置日志轮转策略,以便在达到一定大小或时间时自动清理旧日志。
logrotate 是一个 Linux 系统下用于管理日志文件的工具。它可以自动压缩、删除和轮转日志文件。要使用 logrotate 管理 Golang 应用的日志,你需要创建一个 logrotate 配置文件,然后在 crontab 中设置定期执行 logrotate。
创建一个名为 /etc/logrotate.d/myapp 的配置文件,内容如下:
/path/to/your/golang/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
这个配置表示每天轮转日志文件,保留最近 7 天的日志,压缩旧日志,如果日志文件不存在则不报错,如果日志文件为空则不轮转,以及设置新日志文件的权限和所有者。
接下来,在 crontab 中添加一行以每天运行 logrotate:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
你还可以编写一个自定义的日志清理程序,定期检查日志文件的大小和时间,然后删除超过指定阈值的老旧日志。这个程序可以使用 Golang 的 os 和 time 包来实现。将此程序作为守护进程或定时任务运行,以便持续清理日志。
以下是一个简单的示例,用于删除指定目录下 7 天前的日志文件:
package main
import (
"fmt"
"os"
"path/filepath"
"time"
)
func main() {
logDir := "/path/to/your/golang/app/logs"
cutoff := time.Now().AddDate(0, 0, -7)
filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && info.ModTime().Before(cutoff) {
err = os.Remove(path)
if err != nil {
return fmt.Errorf("failed to remove log file %s: %v", path, err)
}
fmt.Printf("Removed old log file: %s\n", path)
}
return nil
})
}
将此程序作为守护进程或定时任务运行,以便持续清理日志。