Linux 日志轮转入门:用 logrotate 管住不断长大的日志文件

举报
yd_277630351 发表于 2026/11/11 18:28:33 2026/11/11
【摘要】 服务器跑久了,最容易被忽视的问题之一,就是日志文件越长越大。一个应用每天写几百兆日志并不罕见,几个月下来磁盘就被吃掉大半,等到磁盘写满、服务写不进日志甚至写不进数据,问题就已经晚了。日志轮转就是为了解决这个问题:定期把旧日志归档、压缩、删除,让日志文件始终保持在可控的大小。 logrotate 是什么logrotate 是 Linux 上最常用的日志轮转工具,大多数发行版都自带。它本身不产生...

服务器跑久了,最容易被忽视的问题之一,就是日志文件越长越大。一个应用每天写几百兆日志并不罕见,几个月下来磁盘就被吃掉大半,等到磁盘写满、服务写不进日志甚至写不进数据,问题就已经晚了。日志轮转就是为了解决这个问题:定期把旧日志归档、压缩、删除,让日志文件始终保持在可控的大小。

logrotate 是什么

logrotate 是 Linux 上最常用的日志轮转工具,大多数发行版都自带。它本身不产生日志,只按规则处理已有日志文件:按天、按周或者按大小触发,把当前日志改名归档,再让应用写到一个新文件里。它通常由 cron 每天触发一次,所以规则写好之后基本不用人工干预。

写第一条轮转规则

假设应用日志在 /var/log/myapp/ 下面,可以新建一个配置文件:

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
    copytruncate
    dateext
}

这条规则的意思是:每天轮转一次,最多保留 14 个历史文件,旧文件用 gzip 压缩;如果日志文件不存在也不报错,空文件不轮转;轮转时直接把当前文件内容清空而不是移动文件,这样不用重启应用;归档文件按日期加后缀,方便查找。

copytruncate 和 create 怎么选

这是新手最容易踩的坑。create 是先把旧文件改名,再新建一个同名文件,要求应用重新打开文件句柄;如果应用一直拿着旧文件描述符不放,新日志还会写进已经改名的旧文件里。copytruncate 是把文件内容复制走再清空原文件,应用不用重启、不改句柄,但轮转瞬间可能丢失少量正在写入的日志。对不能随便重启的服务,通常先选 copytruncate;能配合重启或支持信号重载的应用,用 create 加 postrotate 发送信号更干净。

先调试,再上线

规则写完不要直接等第二天看结果。先用调试模式跑一次:

logrotate -d /etc/logrotate.d/myapp

调试模式只打印它会做什么,不会真的动文件。确认无误后,用 -f 强制触发一次,检查归档文件和权限是否符合预期。还要注意一个细节:日志目录的属主和权限要和运行应用的用户一致,否则轮转后新文件写不进去。

日常维护的三个习惯

第一,给每类日志单独建规则文件,不要全塞进全局配置,出了问题好定位。第二,用 maxsize 兜底,比如 daily 加 maxsize 200M,日志暴涨当天就触发轮转,不用等到第二天。第三,定期看一眼磁盘和归档数量,配合备份策略清理过期压缩包,轮转只是控制增量,长期留存还是要靠归档和清理。

把日志轮转当成部署的一部分,而不是出问题后的补救,磁盘告警会少很多,排查问题时也能更快找到对应时间的日志。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。