在 Linux 系统中,日志文件过大是常见问题,清理时需避免直接删除正在被进程占用的日志文件(否则可能导致磁盘空间不释放或程序异常)。以下是安全、常用的清理方法,按「推荐程度」排序:
Linux 日志通常由 rsyslog/syslog-ng 或 systemd-journald 管理,配套工具能自动处理日志轮转和清理。
systemd 日志(journalctl)systemd 系统的日志存在 /var/log/journal/,用 journalctl 管理:
# 查看日志占用空间
journalctl --disk-usage
# 清理:只保留最近 2 天的日志
sudo journalctl --vacuum-time=2d
# 清理:只保留 500MB 以内的日志
sudo journalctl --vacuum-size=500M
# 永久限制日志大小(修改配置后重启)
sudo vim /etc/systemd/journald.conf
# 取消注释并修改:
# SystemMaxUse=500M # 总日志最大占用
# SystemKeepFree=1G # 至少保留的空闲空间
sudo systemctl restart systemd-journald
logrotate 管理的日志logrotate 是 Linux 默认的日志轮转工具,配置文件在 /etc/logrotate.conf 和 /etc/logrotate.d/。
如果日志没自动轮转(比如程序没正常触发),可手动执行:
# 强制轮转所有日志(会压缩旧日志、创建新文件)
sudo logrotate -f /etc/logrotate.conf
# 只轮转指定服务的日志(比如 nginx)
sudo logrotate -f /etc/logrotate.d/nginx
如果确定某个日志文件不再需要(比如 /var/log/myapp.log 已停止写入),可按以下方式处理:
用 > 或 truncate 清空文件,避免破坏文件句柄(进程仍可继续写入):
# 方法1:重定向清空(最常用)
sudo > /var/log/myapp.log
# 方法2:truncate 截断到 0 字节
sudo truncate -s 0 /var/log/myapp.log
logrotate 通常会把旧日志命名为 xxx.log.1、xxx.log.2.gz,这些文件已不被进程占用,可直接删除:
# 删除 7 天前的所有 .gz 压缩日志
sudo find /var/log -name "*.gz" -mtime +7 -delete
# 删除某个服务的旧日志(比如 tomcat)
sudo rm -f /var/log/tomcat/*.log.*
清理前先找到占用空间大的日志:
# 查看 /var/log 下最大的 10 个文件
sudo du -sh /var/log/* | sort -rh | head -10
# 查找整个系统中大于 100MB 的文件
sudo find / -type f -size +100M 2>/dev/null
/etc/logrotate.d/myapp):/var/log/myapp.log {
daily # 每天轮转
rotate 7 # 保留 7 份
compress # 压缩旧日志
missingok # 文件不存在也不报错
notifempty # 空文件不轮转
create 0644 root root # 新建日志的权限
}
DEBUG 改为 INFO/WARN,减少无效日志。access_log off; 或 error_log /var/log/nginx/error.log warn;。rm -f 正在写入的日志(比如 rm /var/log/nginx/access.log),会导致:
/etc/docker/daemon.json 限制日志大小)。按以上步骤操作,既能安全清理空间,又不会影响服务运行。