logrotate 入门:别让日志文件悄悄撑满云服务器磁盘

举报
yd_256733395 发表于 2026/11/04 15:00:30 2026/11/04
【摘要】 介绍 Linux logrotate 的运行方式、最小配置、postrotate 与 copytruncate、按大小切割以及上线前的调试方法,

服务跑在云服务器上久了,最容易被忽视的问题之一就是日志。应用日志、Nginx 访问日志每天都在增长,几个月后磁盘告警,才发现一个日志文件已经几十 GB。Linux 自带的 logrotate 就是为了解决这个问题:按时间或大小切割日志、压缩旧文件、只保留最近若干份。本文用一个例子讲清楚它的基本用法。

一、logrotate 是怎么运行的

logrotate 本身不是常驻进程,而是由系统定时调用的。大多数发行版通过 cron.daily 或 systemd 的 logrotate.timer 每天执行一次。全局配置在 /etc/logrotate.conf,各个软件自己的规则放在 /etc/logrotate.d/ 目录下,每个文件对应一类日志。

二、写一个最小配置

假设应用把日志写在 /var/log/myapp/*.log,新建 /etc/logrotate.d/myapp:

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 app app
}
  • daily:每天切割一次,也可以写 weekly 或 monthly。
  • rotate 14:保留 14 份旧日志,更早的自动删除。
  • compress 和 delaycompress:旧日志用 gzip 压缩,但最近一份暂不压缩,方便直接查看。
  • missingok、notifempty:文件不存在不报错,空文件不切割。
  • create:切割后按指定权限和属主新建日志文件。

三、程序不重新打开文件怎么办

很多程序启动时打开日志文件后一直持有文件句柄。logrotate 把文件改名后,程序仍然往旧文件里写。有两种处理方式:一是用 postrotate 脚本通知程序重新打开日志,例如 Nginx 可以发送 USR1 信号;二是使用 copytruncate,先复制再清空原文件,程序无需任何配合,但在复制和清空之间可能丢失少量日志。

postrotate
    systemctl kill -s USR1 nginx.service
endscript

四、按大小切割

如果日志增长很快,可以加上 maxsize 500M,表示即使没到时间,超过 500M 也会切割。注意 logrotate 每天只运行一次,想让大小条件更及时生效,需要把调用频率调高,比如改成每小时执行。

五、先调试再上线

写好配置后,用 logrotate -d /etc/logrotate.d/myapp 以调试模式运行,它只打印将要执行的动作而不真正修改文件。确认无误后,可以用 logrotate -f 强制执行一次,检查生成的文件名和权限是否符合预期。logrotate 的执行状态记录在 /var/lib/logrotate/status 中,排查“为什么没切割”时可以先看这里。

小结

给每个自己部署的服务配一份 logrotate 规则,只需要几行配置,就能让日志保持在可控的大小,避免磁盘被写满导致服务异常。上线前用调试模式检查一遍,再配合磁盘使用率监控,日志问题基本就不用再操心了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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