Linux服务器在持续运行过程中,各类服务、应用和系统本身都会不断生成日志文件,这些日志用于记录运行状态、排查故障,但如果不加以管理,日志文件会不断增大,最终占用大量磁盘空间,甚至导致磁盘满溢,影响服务正常响应。

日志过大的常见原因
首先我们需要了解日志过大的常见诱因,才能针对性解决问题:
- 系统或应用默认没有配置日志轮转策略,日志一直追加写入同一个文件
- 应用出现异常,短时间内产生大量错误日志
- 日志输出级别设置过低,比如将调试级别日志也全部输出到文件
- 历史日志没有定期清理,积累数月甚至数年的日志文件
临时解决:快速清理大日志文件
如果发现磁盘空间已经不足,需要先快速释放空间,可以采用以下临时清理方式,注意不要直接删除正在被进程写入的日志文件,否则可能导致进程无法继续写入日志,甚至引发异常。
1. 查找大日志文件
先通过命令定位占用空间大的日志文件:
# 查找/var/log目录下大于100M的文件,按大小排序
find /var/log -type f -size +100M -exec ls -lh {} ; | sort -k5 -rh
2. 安全清空日志文件
对于正在被进程占用的日志文件,推荐使用truncate命令或者重定向清空,而不是直接删除:
# 方法1:使用truncate清空文件,保留文件权限和inode truncate -s 0 /var/log/nginx/access.log # 方法2:使用重定向清空 > /var/log/mysql/error.log
如果是已经归档的历史日志文件,确认不需要后可以删除:
# 删除30天前的所有.log结尾的日志文件,操作前建议先确认文件列表 find /var/log -name "*.log" -mtime +30 -type f # 确认无误后执行删除 find /var/log -name "*.log" -mtime +30 -type f -delete
长期解决:配置日志自动轮转
临时清理只能解决当前问题,长期还是需要配置日志轮转,让系统自动管理日志的切割、压缩和清理,Linux系统自带的logrotate工具就是专门做这个的。
logrotate基本配置说明
logrotate的配置文件分为主配置/etc/logrotate.conf和子配置目录/etc/logrotate.d/,我们一般给每个服务单独在子配置目录创建配置文件即可。
常用配置参数说明:
| 参数 | 说明 |
|---|---|
| daily/weekly/monthly | 轮转周期,按天/周/月执行 |
| rotate 7 | 保留7个轮转后的日志文件,超过的自动删除 |
| compress | 轮转后的日志文件用gzip压缩 |
| missingok | 日志文件不存在时不报错 |
| notifempty | 日志文件为空时不轮转 |
| create 0644 root root | 轮转后创建新文件,设置权限和属主 |
| postrotate | 轮转后执行的命令,一般用于重启服务让服务重新打开日志文件 |
配置示例:给Nginx日志配置轮转
在/etc/logrotate.d/目录下创建nginx配置文件:
/var/log/nginx/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 nginx nginx
sharedscripts
postrotate
# 向Nginx主进程发送重新打开日志的信号
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
配置完成后可以手动测试配置是否生效:
# 调试模式执行,不会实际修改文件,只输出执行过程 logrotate -d /etc/logrotate.d/nginx # 强制立即执行轮转 logrotate -f /etc/logrotate.d/nginx
其他优化方案
调整应用日志输出级别
很多应用默认会输出调试级别的日志,生产环境可以调整为警告或者错误级别,减少日志产生量。比如Java应用可以修改logback或者log4j的配置文件,将level设置为WARN或者ERROR。
将日志输出到远程日志服务器
如果本地磁盘空间有限,可以将日志通过rsyslog等工具发送到远程日志服务器存储,本地只保留最近几天的日志即可。修改/etc/rsyslog.conf添加远程日志服务器地址:
# 将所有日志发送到远程日志服务器,端口514 *.* @@192.168.0.1:514
修改后重启rsyslog服务生效:
systemctl restart rsyslog
操作注意事项
清理日志前一定要确认日志是否还有用,重要业务的日志建议先备份再清理,避免后续排查故障缺少依据。
不要直接删除正在被进程写入的日志文件,否则进程会一直占用原来的文件描述符,磁盘空间不会立即释放,需要重启对应进程才能释放空间。
配置logrotate后,建议定期检查轮转是否生效,避免配置错误导致日志还是一直增大。