1. 日志文件为什么会失控:膨胀路径与真实风险
干运维这些年,我接手过不少“服务器快挂了”的求助,十次里有七八次都是同一个原因——日志把磁盘塞满了。不少人觉得日志就是个记录文件,写满了顶多占点空间,没什么大不了。真上了生产环境你才会明白,日志失控的后果远远不只是“磁盘空间少了几个G”这么简单。
1.1 日志膨胀的三个典型场景
先说说最常见的三种失控路径,你可以对照自己的服务器排查一遍。
第一种:访问日志和错误日志叠加增长。 拿 Nginx 举例,access.log 每来一个请求就追加一行。一个日活几万的小站点,一天的 access.log 就能长到 2 到 5 个 GB。如果后端接口有循环请求或者被脚本扫描,日志量翻倍也是家常便饭。Java 后端项目通常有 info、error、debug 多级日志,Spring Boot 默认的 logging.file 配置如果不设置滚动策略,单个文件可以一直长到好几个 GB。
第二种:调试日志忘关。 开发排查问题时把日志级别调到了 DEBUG,问题定位完直接下班,忘了改回 INFO。到了第二天早上,某个高频调用接口的 DEBUG 日志能把磁盘打爆。这个场景在中小团队太常见了,我见过不止一次因为一行 DEBUG 日志导致线上告警的情况。
第三种:第三方组件与系统日志累积。 比如 /var/log/messages 或 /var/log/secure 在遭受密码爆破时,每秒能写入几十条认证失败记录。还有容器化环境里,Docker 默认的 json-file 日志驱动如果不配置旋转策略,容器 stdout 输出会全部堆在主机磁盘上,尤其是一些不打印业务日志只疯狂输出堆栈信息的应用。
1.2 磁盘写满后的连锁反应
磁盘使用率达到 100% 是一个分水岭,之后的很多现象会让人误判为应用故障。
数据库类应用最先扛不住。MySQL 的 binlog 和中继日志需要磁盘空间来完成写入和恢复,磁盘满了之后会直接报“No space left on device”,事务提交失败,主从同步中断。更麻烦的是,从库因为缺日志无法追平主库,恢复起来非常痛苦。
然后是系统层面的连锁反应。cron 任务无法执行,临时文件创建失败,SSH 登录时无法写入 utmp/wtmp 记录,甚至连 history 命令都保存不了。如果你跑的是企业级应用,Java 虚拟机的 Full GC 日志和堆转储文件如果同时写不进磁盘,进程可能直接异常退出,这时候再排查故障会非常被动。
最容易被忽略的是审计类需求。安全审计和等保检查通常要求保留一段周期内的操作日志,日志被粗暴清空后,一旦出现安全事故需要追溯,你会发现关键记录早就没了。所以日志自动管理的核心不光是“不让磁盘爆”,还得考虑“该留的留多久、该删的怎么删、该压缩的怎么压缩”。
1.3 系统自带轮转能力为何不够用
有些运维新人会问:Linux 不是自带了 logrotate 吗?为什么还要专门做“自动管理”?
确实,主流的 Linux 发行版都会装 logrotate,而且系统日志(比如 /var/log/messages、/var/log/cron、/var/log/secure)默认就在它的管理范围内。但问题在于:
- 默认配置通常以周为轮转周期,保留 4 份左右,对于访问量稍大的业务日志远远不够;
- rsyslog 管理的日志有 logrotate 兜底,但业务应用(Java 的 Spring Boot、Nginx、Tomcat、Python 的 gunicorn)产生的日志默认并不在 logrotate 的管理列表中,需要你手动去 /etc/logrotate.d/ 下添加配置;
- 很多应用自己有日志库层面的滚动策略(比如 Logback 的 SizeAndTimeBasedRollingPolicy),但处理不好“滚动后的旧文件谁来清”的问题,日志库只负责自己滚动,旧文件的清理策略往往要另做;
- 容器场景既有的镜像里可能连 logrotate 都没有装,或者应用进程根本不是通过系统服务脚本启动的,原生的日志轮转工具拿它没办法。
所以,真正意义上的“Linux 自动管理日志文件”,是把系统日志、应用日志、容器日志统一纳入一套策略:到周期切割、到大小切割、压缩归档、过期清理、腾出磁盘空间。下面我按实操链路一步步讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. logrotate 的核心机制与配置语法:搞懂这套再动手
logrotate 是个老牌工具,几乎所有发行版都自带。它的工作方式不复杂:由一个 cron 任务每天触发一次,读取 /etc/logrotate.conf 和 /etc/logrotate.d/ 目录下所有配置文件,对满足条件的日志文件执行切割、压缩、删除等操作。它的判断依据是“文件是否达到指定周期”或“文件大小是否达到阈值”。
2.1 配置文件布局与执行入口
先看一下 logrotate 的默认布局,不同的发行版略有差异,但大体一致:
- 主配置文件:/etc/logrotate.conf
- 子配置目录:/etc/logrotate.d/
- 状态文件:/var/lib/logrotate.status(新版本)或 /var/lib/logrotate/logrotate.status
- 定时任务入口:/etc/cron.daily/logrotate
Debian/Ubuntu 和 CentOS/RHEL 在 cron 入口上差别不大,都是每日执行一次。需要注意的是,如果日志在一天内就涨到了好几个 GB,只靠每日执行一次的 logrotate 是不行的,因为默认的 daily 轮转最早也要等到第二天 cron.daily 触发。这种情况下需要额外配置大小触发轮转,或者把 logrotate 的执行频率改短。
验证一下你机器上 logrotate 的主配置,通常长这样:
conf复制weekly
rotate 4
create
dateext
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
weekly 是默认轮转周期,rotate 4 表示保留 4 份旧日志,create 表示切割后创建新的空日志文件,include 把 /etc/logrotate.d/ 下的子配置加载进来。dateext 是很多发行版默认开启的参数,切割后的文件会加上日期后缀,比如 access.log-20250115,这比数字序号可读性好很多,推荐保留。
2.2 核心配置指令对照
手动编写业务日志的 logrotate 配置前,至少要对下面这些指令有数。我整理成了表格,方便你快速对照:
| 指令 | 作用说明 | 我的建议 |
|---|---|---|
| daily / weekly / monthly | 轮转周期 | 业务日志一般用 daily 或 size 触发 |
| rotate N | 保留 N 份轮转后的历史文件 | 根据磁盘和合规要求设 7~30 |
| size M | 达到 M 大小即轮转,如 size 500M | 高频日志用它兜底 |
| compress | 轮转后 gzip 压缩 | 默认开启,非常省空间 |
| delaycompress | 延迟到下一次轮转再压缩 | 配合 copytruncate 使用要注意 |
| copytruncate | 先复制文件再清空原文件 | 适用于不关闭文件句柄的应用,如 Nginx 之外的部分进程 |
| create MODE USER GROUP | 轮转后新建空日志并设置权限 | 防止新文件属主不对导致写不进去 |
| dateext / dateformat | 使用日期作为后缀 | 推荐保留 dateext |
| notifempty | 文件为空就不轮转 | 建议开启,避免产生空文件 |
| missingok | 文件不存在时不报错 | 建议开启 |
| postrotate / endscript | 轮转后执行脚本 | 常用于向进程发送信号让它重新打开日志句柄 |
| sharedscripts | 多文件匹配时只执行一次脚本 | 配置了多个日志路径时用 |
| maxsize | 周期性轮转的基础上,超过大小立即触发轮转 | 与 size 不同,maxsize 不替代周期性轮转 |
| su 用户 组 | 以指定用户权限执行轮转 | 日志目录权限受限时必须加 |
这些指令里,我认为最容易踩坑的是 copytruncate 和 create 的选择。两者不能同时使用。create 的思路是:把旧日志文件改名,再创建一个新的空文件,应用如果持有这个文件的句柄,写入会继续往被改名后的旧文件里写,所以一般要配合 postrotate 里的 kill -USR1 信号,让 Nginx 或 rsyslog 重新打开文件句柄。copytruncate 的思路则不同:先复制原文件内容到新文件,然后立刻把原文件截断成空文件。应用从头到尾持有的文件句柄都没变,所以不需要发信号,但由于复制和截断之间存在时间差,中间新产生的日志可能会丢一点。这个丢日志的窗口非常短(毫秒级到秒级),一般业务能接受;但不建议把 copytruncate 用在有严格审计要求的日志上。
2.3 手动测试配置是否生效
写完配置后千万别直接等 cron 跑,先用 debug 模式验证一遍:
bash复制logrotate -d /etc/logrotate.conf
-d 是 dry-run 模式,不会真正执行轮转,但会把匹配到的文件、会执行的动作、会调用的脚本都打印出来。输出里如果出现 error 字样,说明配置有语法问题。确认无误后,用下面命令手动强制执行一次:
bash复制logrotate -f /etc/logrotate.conf
-f 是强制轮转,不管是否达到周期都会执行。强制跑一次后,检查对应目录里是否生成了新文件,旧文件是否被正确改名。
3. 一套拿来就能用的实战配置:Nginx、Java应用与Docker容器日志
纸上谈兵没意思,这里直接给出几套我自己在生产环境用过的配置,你根据实际情况微调即可。
3.1 Nginx 访问日志和错误日志配置
Nginx 最规范的切割方式是 create + postrotate 发信号,让它重新打开日志文件。配置写在 /etc/logrotate.d/nginx 里:
conf复制/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
dateext
create 0644 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
这个配置的要点:daily 按天切割,rotate 14 保留最近两周的日志,compress 把切割下来的旧日志压缩,delaycompress 是为了配合 postrotate,确保切割后新文件正常写入。之所以用 delaycompress,是因为 Nginx 收到 USR1 信号后会重新打开日志句柄,但如果当天立刻压缩刚刚切割下来的文件,文件句柄切换的时间窗口不够宽裕,偶尔会丢失最后几行日志。延迟到下一天压缩,就能降低这个风险。实际用下来,Nginx 的日志丢失情况几乎可以忽略。
sharedscripts 配合 postrotate 的含义是:如果 /var/log/nginx/ 下匹配到了多个 .log 文件,轮转完成后,脚本只执行一次,而不是对每个文件都发一次信号。信号发多了 Nginx 也能承受,但没必要浪费。
3.2 Java 应用(Spring Boot)日志配置
Java 应用的情况复杂一些。很多项目用的 Logback 或 Log4j2 自带的滚动策略,这样 logrotate 没必要再去切一次已经滚过的文件。但我也见过不少项目直接把 Spring Boot 的日志写到一个固定文件,比如 app.log,或者用 nohup java -jar app.jar > app.log 2>&1 启动,这两种情况必须用 logrotate 来做兜底。
如果在 Linux 上用 nohup 启动 Java 进程,进程会把 stdout/stderr 重定向到 app.log,文件句柄一直在 Java 进程手里。此时最稳妥的方案是 copytruncate,因为 Java 进程没有提供类似 Nginx 的 USR1 信号来重新打开日志文件,即使你用 kill -HUP 也大概率没反应。
conf复制/work/project/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
dateext
}
需要注意,copytruncate 的切割逻辑是先复制再截断。文件越大,复制耗时越长,截断窗口内写入的日志就越容易丢。所以高频写入且单文件巨大的 Java 日志,光靠 copytruncate 不够,最好从源头改:让应用使用 Logback 的滚动策略,按大小或按天自己滚,滚完的文件再交给 logrotate 做压缩和过期清理。两段式组合才是长期方案。
这里再补充一个很多老手都在用的做法:用 Logback 的 SizeAndTimeBasedRollingPolicy 把单文件大小控制在 200MB 以内,切割出来的历史文件保留日期的同时加上索引,再配合 logrotate 清理 7 天前的归档。这样不会出现“一个大文件复制半天”的窘境,也方便直接定位某一天的日志。
3.3 Docker 容器日志的自动清理
容器化部署越来越普遍,容器日志的自动管理比传统日志更麻烦。Docker 默认的 json-file 日志驱动会把容器写到 /var/lib/docker/containers/<容器ID>/*-json.log,这个文件能长到几十 GB。
解决容器日志膨胀有两个方向。第一方向是改 Docker daemon 配置,加上日志轮转参数:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}
改完 /etc/docker/daemon.json 后执行 systemctl restart docker,新容器生效,已经存在的容器需要重建才会应用新策略。这个方案的好处是 Docker 自己管理文件切割,旧文件会自动滚动;局限是单个容器日志超过 100m 时会按 100m 切分,切分出来的旧文件数量受 max-file 限制。
第二方向是装 docker-logrotate 或者直接用 logrotate 去轮转 json 文件,配置和普通日志类似,但路径要写对。注意容器 json 文件切割时要小心文件句柄问题,Docker 的老版本对 json 文件的写入句柄可能在切割后不释放,所以如果你用 logrotate 去切 docker json 文件,推荐使用 copytruncate。更省心的方案是直接限制容器输出或把日志收集到 ELK/Loki 这类集中式平台,节点本地只保留短期归档。
4. 配置写好之后必须做的调试动作与常见报错处理
很多人在 /etc/logrotate.d/ 下新建完文件就认为完事了,实际上 logrotate 的调试和排错有一套独立的流程。这里把我踩过的坑整理出来,能帮你少走不少弯路。
4.1 验证配置语法的正确姿势
logrotate 没有专门的 -t 语法检查参数,需要用 debug 模式来验证:
bash复制logrotate -d /etc/logrotate.d/nginx
看着输出内容是否包含 /var/log/nginx/*.log,以及是否提示 considering log。如果提示 error: nginx:1 unknown option,说明指令名写错了,去对照一下官方 man 手册。如果提示 error: skipping "/var/log/nginx/access.log" because parent directory has insecure permissions,说明日志目录权限太宽松。logrotate 出于安全考虑,会拒绝轮转其他用户可写的目录。解决办法是把目录权限收敛到 755 或 750,属主设为 root 或对应的服务账户。
有时候你会看到 Ignoring access.log because of bad permissions,这通常意味着日志文件的属主和 logrotate 当前运行的用户不一致。如果文件属主是 nginx 用户,而 logrotate 以 root 身份运行时一般没这问题,但如果你用了 su nginx nginx 这样的配置,就需要保证 nginx 用户对目录有写权限。
4.2 使用状态文件排查轮转周期
logrotate 通过状态文件记忆上次轮转时间。判断某个日志为什么没按预期轮转,可以查状态文件:
bash复制cat /var/lib/logrotate.status | grep access
输出可能长这样:
code复制"/var/log/nginx/access.log" 2025-1-14-3:20:00
状态文件里记录的是最近一次轮转的时间。如果今天已经跑过轮转,时间戳显示今天,那 cron.daily 没触发第二遍是正常的。如果你想无视状态文件强制轮转,用:
bash复制logrotate -f /etc/logrotate.d/nginx
如果强制轮转后状态文件没更新,还有一种可能:logrotate 认为你配置的日志文件没有满足轮转条件。比如你配了 daily 且文件为空,notifempty 就把它跳过了。验证办法是去掉 notifempty 再强制执行,或者用 echo test >> /var/log/nginx/access.log 先写入一点内容。
4.3 轮转后日志内容没有写入新文件的排查
这个问题的典型表现是:轮转成功执行,新文件也创建了,但应用日志还是写进了被改名的旧文件里。原因几乎都出在文件句柄没切换。Nginx 之类支持信号的应用,需要确认 postrotate 里的信号真的执行了。排查时可以手动执行 postrotate 里的命令看看进程是否响应:
bash复制cat /var/run/nginx.pid
kill -USR1 $(cat /var/run/nginx.pid)
然后看新的 access.log 是否有内容写入。Java 进程不支持信号切换句柄的场景,只能靠 copytruncate,不能硬套 create + postrotate。
还有一种隐蔽的问题:某些应用以追加模式打开日志后,做 rename 时旧文件句柄不释放,导致新日志全写到了旧文件里。你可以用 lsof | grep deleted 查看是否有进程占用了已删除或已改名的日志文件。发现类似 java ... app.log-20250114 (deleted) 的记录,说明 Java 进程还在往旧文件里写,根本原因是进程持有的句柄对应的是被 rename 的 inode。如果应用没有自动重开句柄的能力,这种方式无法根治,只能改成 copytruncate。
5. 再进一步:超大日志的应急处理、分析与预防性告警
logrotate 的定时清理能管住“常态增长”,但运维中总有几个突发场景需要应急手段:某个日志文件已经长到 20G 以上,logrotate 配了但还没到执行时间,磁盘眼看要满了,这时候怎么办?我分享一套先止损、再分析、后预防的流程。
5.1 先止损:超大日志的不停机截断与查看技巧
如果日志文件正在被进程占用,直接 rm 文件是有问题的。删掉文件后,进程持有的句柄依然指向旧 inode,磁盘空间不会释放,只是文件名变成 deleted。正确做法是用 truncate 截断:
bash复制truncate -s 0 /var/log/nginx/access.log
这个操作会把文件瞬间清空,进程句柄不受影响,后续日志继续写入空文件,磁盘空间立刻释放。但注意,truncate 是不可逆操作,执行前确认不需要这个文件里的历史内容。如果需要保留现场,先用 cp 或 tar 归档一份,或者先 tail 抓取最近的关键内容再截断。
几十 GB 的日志没法用编辑器直接打开,查看和分析要用对工具。超大文件的分析套路:
- 看尾部最新日志:
tail -n 200 access.log - 实时跟踪:
tail -f access.log - 按关键字检索上下文:
grep -n "ERROR" access.log | head -50 - 统计某个时间段的请求量:结合 awk 提取时间字段后计数
- 快速定位最耗时的接口:用 awk 分析响应时间字段,排序取 Top 10
看到这里你可能发现了,这几条命令本身不复杂,但在日志文件已经有 20G 的场景下,执行效率差别很大。比如随手 grep 一个模式会全文件扫描,几秒钟到几分钟不等;如果只想看某一天的日志,先用 awk 按日期过滤会比全量 grep 快很多。
5.2 从日志里找规律:不只是看报错
日志自动管理的另一半是让日志数据“可分析”。日志文件不是清掉了就完事,很多关键信息需要在失控之前就被提取出来。下面是我经常用的一套分析动作:
bash复制# 统计 access.log 里 Top 10 的客户端 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 统计 Top 10 的请求路径
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -10
# 统计 5xx 错误占比
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 按小时统计请求量,判断是否有突发流量
awk '{print $4}' access.log | cut -d: -f1-2 | uniq -c
把这些分析结果和企业微信/钉钉机器人 API 对接,就能实现日志异常告警。比如某小时请求量突然变成平时的 5 倍,或者某个 IP 在短时间内请求了 1000 次以上,自动推送告警消息。这套做法在分析安全事件时尤其好用。
5.3 预防性告警:磁盘阈值脚本
logrotate 处理完之后,最好再加一道保险:磁盘空间监控脚本。脚本可以放在 cron 里每小时执行一次,超过阈值就发通知。这里给一个最简版本:
bash复制#!/bin/bash
threshold=85
current=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$current" -ge "$threshold" ]; then
echo "Disk usage on / is ${current}%" | mail -s "Disk Warning" ops@example.com
fi
实际生产环境用企业微信或钉钉的 webhook 机器人更即时,脚本核心逻辑不变。有了这道保险,即使 logrotate 配置出问题或者日志量突然暴增,你也能在磁盘写满前收到通知并介入处理。
6. 轮转策略设计的高级话题:保留周期、压缩算法与错峰执行
表面上 logrotate 只是定时切文件,但真正要设计一套完善的日志生命周期管理策略,还需要考虑保留周期、压缩算法和错峰执行等因素。
6.1 保留周期怎么定:别拍脑袋,按场景反推
保留周期取决于两个约束:合规要求和磁盘成本。安全等保或 ISO 27001 审计通常要求操作日志、登录日志保留 180 天以上;业务日志的分析价值随时间递减,一般保留 30 天足够;调试日志和容器标准输出则保留 7 天即可。
合理的设计方式是先按类别分目录、分文件,再对每个类别单独配置 rotate 份数。把不同重要性的日志混在一个目录里统一轮转,会导致要么重要的提前被清掉,要么不重要的占着磁盘空间。我自己比较习惯的文件规划如下:
| 日志类别 | 路径示例 | 轮转策略 | 保留时间 |
|---|---|---|---|
| 系统安全日志 | /var/log/secure | monthly | 12 个月 |
| Nginx 访问日志 | /var/log/nginx/access.log | daily + size 触发 | 14 天 |
| 应用错误日志 | /work/app/logs/error.log | daily | 30 天 |
| 容器标准输出 | Docker json-file | max-size 100m | 5 份 |
| 调试/临时日志 | /tmp/debug-*.log | daily | 3 天 |
6.2 压缩算法取舍:gzip 还是 xz
logrotate 默认用 gzip,压缩比对于文本日志通常在 80% 到 90% 之间,也就是 1GB 文本压完只剩 100MB 左右。如果磁盘非常紧张,可以配置为 xz:
conf复制compress
compresscmd /usr/bin/xz
compressext .xz
xz 的压缩比比 gzip 高大约 20% 到 30%,但压缩耗时和 CPU 消耗显著增加。对于每天动辄几 GB 的日志来说,压缩本身也会消耗 CPU,建议在业务低峰期执行轮转,或者继续使用 gzip。
还有一个细节:delaycompress 会让当天的旧日志暂不压缩,等到下个轮转周期才压缩。如果每天日志量很大,延迟一天意味着磁盘上会多出一天的未压缩存量。磁盘不宽裕的场景可以去掉 delaycompress,代价是最多丢失切割瞬间的一小段日志。
6.3 错峰执行:避免每天同一时刻的 IO 抖动
系统的 logrotate 由 cron.daily 统一调度,每天凌晨 3 点 20 分左右执行。如果你的服务器上同时跑着多个应用的日志轮转,压缩动作会把磁盘 IO 和 CPU 瞬间拉高,导致业务接口响应变慢。
优化思路有两类。一类是给不同日志配置不同的执行时间,绕开 cron.daily 的默认时间点,用 crontab 按需触发:
bash复制30 1 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx > /dev/null 2>&1
另一类是把重量级 IO 操作错开,比如把 Nginx 日志放在凌晨 1 点切,Java 应用的日志放在凌晨 4 点切,数据库 binlog 的清理放在凌晨 5 点后。长期运行后你会发现,这几分钟的调度错峰能省掉不少半夜的告警电话。
7. 设计一套自己的日志管理基线时的几点心得
看到这里,日志自动管理的工具层面已经过了一遍。但工具始终只是手段,真正稳定的日志管理要形成一套基线。根据我实际管理过的服务器和项目,总结几条心得供你参考:
第一,先回答“留多久,怎么留,谁来清”三个问题,再动手写配置。建议把不同服务产生的日志统一收集目录,尽量做到每个项目一个根目录,下面分类存放;避免日志文件散落在各个路径。规范目录比规范配置更难,但回报也更大——排查问题时不用满服务器找日志。
第二,logrotate 不是万能的,它扛不住“进程持有文件句柄不释放”和“日志在一天内涨几个 GB”这类极端情况。前者需要从应用层面解决,后者需要把 logrotate 的执行周期改成小时级,或者要求应用层按大小滚动。
第三,日志的监控和轮转同等重要。磁盘告警脚本、日志量突变检测、错误日志关键字告警,这三样建议作为必配项。自动管理不是“配好就不管”,而是让系统在异常时能自动处理一部分风险,剩下的风险通过告警通知到人。
第四,留一个手工排查的“逃生舱”:logrotate -d 语法检查、logrotate -f 强制轮转、lsof | grep deleted 句柄确认、truncate -s 0 应急清理,这四个命令关键时刻能救命。
上面这些配置和思想,我从测试环境到生产环境反复折腾过很多遍。用踏实一点的方案替换看似复杂的技巧后,日志类故障明显减少了。尤其是新接手一套服务器的时候,我会第一时间检查所有日志文件是否都在某个轮转策略的覆盖范围内,确认没有“漏网之鱼”,再把状态文件和 cron 执行记录留档备查。这一步做完,磁盘告警能少上一大半。
