logrotate是Debian系统自带的日志管理工具,可自动轮转、压缩和删除Golang应用程序的日志文件,无需修改应用代码。
操作步骤:
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/目录下新建配置文件(如golang-app),内容如下(根据实际日志路径调整):/var/log/golang-app/*.log {
daily # 每天轮转一次(可选:weekly/monthly)
rotate 7 # 保留最近7个日志文件
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件的权限和所有者
}
sudo logrotate -d /etc/logrotate.d/golang-app
若需立即执行轮转,可添加-f参数:sudo logrotate -f /etc/logrotate.d/golang-app
/etc/cron.daily/logrotate),无需额外配置。若需更细粒度的日志管理(如按文件大小、应用状态触发轮转),可使用lumberjack库(第三方日志轮转工具),直接在代码中实现日志清理。
操作步骤:
go get gopkg.in/natefinch/lumberjack.v2
lumberjack.Logger设置为日志输出目标,示例如下:package main
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/golang-app/app.log", // 日志文件路径
MaxSize: 10, // 单个日志文件最大10MB(超过则轮转)
MaxBackups: 5, // 保留最多5个旧日志文件
MaxAge: 30, // 保留最多30天
Compress: true, // 压缩旧日志
})
// 示例日志输出
log.Println("This is a log message from Golang application.")
}
Filename:日志文件路径(需确保应用有写入权限);MaxSize:单个日志文件的最大大小(单位:MB);MaxBackups:保留的旧日志文件数量;MaxAge:旧日志文件的最大保留天数;Compress:是否压缩旧日志(减少存储占用)。若Golang应用通过systemd以服务形式运行(如myapp.service),可使用journalctl命令管理日志。
常用操作:
sudo journalctl -u myapp.service -n 100 # 查看最近100条日志
sudo journalctl --vacuum-time=2weeks # 删除两周前的日志
sudo journalctl --vacuum-size=100M # 限制日志总大小为100MB
/etc/systemd/system/myapp.service),添加以下配置以限制日志大小:[Service]
StandardOutput=journal
StandardError=journal
LogLevelMax=info
重启服务使配置生效:sudo systemctl daemon-reload
sudo systemctl restart myapp.service
若需完全自定义清理逻辑(如按文件名前缀、特定目录清理),可编写Shell脚本并通过cron定时执行。
操作步骤:
/usr/local/bin/cleanup_golang_logs.sh):#!/bin/bash
LOG_DIR="/var/log/golang-app"
MAX_DAYS=7 # 保留最近7天的日志
# 查找并删除超过MAX_DAYS天的.log文件
find "$LOG_DIR" -type f -name "*.log" -mtime +$MAX_DAYS -exec rm -f {} \;
echo "$(date): Deleted old Golang logs older than $MAX_DAYS days." >> /var/log/log_cleanup.log
sudo chmod +x /usr/local/bin/cleanup_golang_logs.sh
crontab -e),添加以下行(每天凌晨1点执行):0 1 * * * /usr/local/bin/cleanup_golang_logs.sh
或系统级cron(/etc/crontab):0 1 * * * root /usr/local/bin/cleanup_golang_logs.sh
journalctl可简化日志管理;根据实际需求选择合适的方法,可有效避免Golang日志占用过多磁盘空间。