Linux服务器日志文件会随时间不断增长,占用大量磁盘空间,影响系统性能。需要建立有效的日志压缩和归档机制。
logrotate是Linux系统自带的日志轮替工具,可配置自动压缩、轮替和删除旧日志。
# 全局设置
weekly # 每周轮替
rotate 4 # 保留4个归档
create # 创建新日志文件
compress # 压缩归档文件
delaycompress # 延迟压缩(下一次轮替时压缩)
dateext # 使用日期作为后缀
# 特定日志配置
/var/log/nginx/access.log {
daily # 每天轮替
rotate 30 # 保留30天
missingok # 如果日志不存在也不报错
notifempty # 空日志不轮替
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
对于特殊需求,可编写自定义脚本:
#!/bin/bash
# 日志归档脚本
LOG_DIR="/var/log/myapp"
ARCHIVE_DIR="/var/log/archives"
DATE=$(date +%Y%m%d)
# 压缩7天前的日志
find $LOG_DIR -name "*.log" -mtime +7 -exec gzip {} \;
# 移动压缩日志到归档目录
[ -d $ARCHIVE_DIR ] || mkdir -p $ARCHIVE_DIR
find $LOG_DIR -name "*.gz" -exec mv {} $ARCHIVE_DIR \;
# 删除90天前的归档
find $ARCHIVE_DIR -name "*.gz" -mtime +90 -delete
# 可选: 清理空日志文件
find $LOG_DIR -type f -name "*.log" -size 0 -delete
对于使用systemd的系统:
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=1G
SystemMaxFileSize=100M
MaxRetentionSec=1month
对于大规模日志管理,可部署Elasticsearch + Logstash + Kibana (ELK)堆栈:
如果日志归档后应用无法写入: - 检查应用是否有重新打开日志文件的机制 - 检查文件权限是否正确 - 确认磁盘空间充足
通过以上方案,可以有效管理Linux服务器日志,防止磁盘空间被日志文件占满,同时保留必要的日志历史记录用于审计和故障排查。