logrotate是Linux系统默认启用的唯一日志轮转机制,由crond每日调用执行,独立于rsyslog、nginx等服务;它通过/etc/logrotate.d/下预装配置(如rsyslog、nginx、mysql等)管理对应服务日志,但不处理systemd-journald的二进制日志。

没有 Linux 自带服务会“自动”轮转自己的日志——logrotate 才是唯一默认启用的日志轮转机制,且它本身不隶属于任何应用服务。
logrotate 是系统级轮转工具,不是服务自身的功能
像 rsyslog、nginx、tomcat、mysql 这些服务,只负责往文件里写日志,完全不感知“切割”“压缩”“删除”。它们甚至不知道自己日志被重命名过,除非你显式配置 postrotate 脚本通知它们(比如 systemctl reload nginx)。
真正执行轮转动作的是独立进程:logrotate,它由 crond 每天调用一次(脚本路径通常是 /etc/cron.daily/logrotate),读取配置后批量处理匹配的日志路径。
所以不存在“哪个服务自带轮转”,只存在“哪些服务的 logrotate 配置被预装了”。
/etc/logrotate.d/ 下常见预装配置有哪些
主流发行版(如 RHEL/CentOS、Debian/Ubuntu)在安装某些软件包时,会自动向 /etc/logrotate.d/ 写入对应配置文件。是否启用取决于该包是否被安装,而非系统版本:
-
rsyslog:几乎所有系统都预装,其配置通常已存在,管理/var/log/messages、/var/log/syslog等 -
httpd或nginx:仅当 Apache/Nginx 被安装后才出现对应配置;路径需与服务实际日志路径一致(如/var/log/nginx/*.log) -
mysql或mariadb:安装数据库服务后生成,但默认可能只轮转错误日志,慢查询日志需手动加入 -
chrony或ntpd:部分版本预装,轮转时间同步服务日志 -
secure、spooler:RHEL 系发行版中常驻的系统日志分片配置,对应/var/log/secure、/var/log/maillog等
systemd-journald 不走 logrotate 流程
systemd-journald 的日志不落地为普通文本文件,默认存在 /run/log/journal/(内存)或 /var/log/journal/(持久化后),它有自己的空间管理策略(由 journald.conf 中的 SystemMaxUse=、MaxRetentionSec= 控制),和 logrotate 完全无关。
试图对 /var/log/journal/ 下的二进制文件做 logrotate 是无效的,journald 会拒绝读取被重命名或移动过的文件。
如何确认某个服务是否已被 logrotate 管理
别猜,直接查:
- 运行
ls /etc/logrotate.d/ | grep -i nginx(把nginx换成你要查的服务名) - 检查配置内容是否匹配真实日志路径:
cat /etc/logrotate.d/nginx | grep "/var/log/nginx" - 看状态文件里有没有记录:
grep "nginx" /var/lib/logrotate.status - 手动测试是否生效:
logrotate -d /etc/logrotate.d/nginx(只输出调试信息,不真操作)
最容易被忽略的是路径不一致——比如 Nginx 编译安装在 /usr/local/nginx,但配置里写的是 /var/log/nginx,那轮转永远不触发。


















