Linux 中如何使用 gzip 清理并压缩过期的系统日志

作者:袖梨 2026-08-29

gzip本身不能清理日志,需结合find查找过期文件并压缩,或通过logrotate实现自动轮转压缩;生产环境推荐logrotate,手动清理宜用find+gzip配合过滤条件和权限控制。

直接用 gzip 本身不能“清理”日志,它只负责压缩单个文件;真正实现“清理+压缩过期日志”的完整流程,需要结合 find 查找、gzip 压缩、再配合 logrotate 或定时脚本做自动化管理。核心是分两步走:先识别过期日志,再安全压缩或删除。

用 find + gzip 批量压缩 N 天前的日志文件

这是最常用的手动或脚本化方式,适合清理 /var/log 下散落的旧 .log 文件(如 auth.logsyslog 等未被 logrotate 管理的临时日志):

  1. 压缩 14 天前的所有 .log 文件(保留原文件)

    sudo find /var/log -name "*.log" -mtime +14 -exec gzip -k {} ;

    -k 表示 keep 原文件,避免误删;压缩后生成 xxx.log.gz

  2. 压缩并立即删除原文件(更省空间)

    sudo find /var/log -name "*.log" -mtime +14 -exec gzip {} ;

    (默认行为,压缩后原 .log 消失)

  3. 跳过正在写入的日志(避免损坏):加 -type f! -name "current*" 等条件过滤,例如:

    sudo find /var/log -type f -name "*.log" -mtime +14 ! -name "journal*" -exec gzip -k {} ;

用 logrotate 实现自动压缩与轮转

这是生产环境推荐做法——不是“事后清理”,而是让系统主动控制日志生命周期,避免日志暴涨:

  1. 编辑配置文件:sudo nano /etc/logrotate.d/myapp(或修改 /etc/logrotate.conf
  2. 写入标准规则,例如:

    /var/log/myapp/*.log {

    daily

    rotate 7

    compress

    delaycompress

    missingok

    notifempty

    create 0644 root root

    }

  3. 关键点说明:

    compress:轮转后自动用 gzip 压缩旧日志(生成 .log.1.gz);

    delaycompress:延迟压缩,确保最新轮转的 .log.1 暂不压缩,方便紧急查看;

    rotate 7:最多保留 7 个归档(含压缩和未压缩),超出的自动删除。

压缩后进一步归档或清理 .gz 文件

如果压缩后的 .gz 文件也积压过多(比如保留了几个月),可再清理旧压缩包:

  1. 删除 60 天前的 .gz 日志:

    sudo find /var/log -name "*.log.*.gz" -mtime +60 -delete

  2. 或打包归档成一个文件(便于离线保存):

    sudo tar -czf /backup/syslog-$(date -d 'last month' +%Y%m).tar.gz /var/log/syslog.*.gz

    再用 rm /var/log/syslog.*.gz 清空目录

注意事项和避坑提醒

操作日志前务必注意以下几点,避免服务中断或数据丢失:

  1. 不要直接 gzip 正在被服务写入的日志(如 /var/log/syslog),会导致写入失败或日志丢失;应等 logrotate 触发轮转后,再对 syslog.1 等旧文件操作
  2. journalctl 日志不用 gzip 处理:systemd journal 使用二进制格式,需用 journalctl --vacuum-time=2weeks--vacuum-size=500M 管理
  3. 测试命令加 -print 先预览:执行 find ... -exec 前,先运行 find ... -print 看匹配到哪些文件,确认无误再加 -exec
  4. 权限问题:/var/log 下多数文件属主为 root,必须加 sudo;普通用户无法读取或压缩它们

相关文章

精彩推荐