journalctl 日志保留规则主要由 /etc/systemd/journald.conf 中的 SystemMaxUse 与 MaxRetentionSec 共同决定,修改后通常需要重启 systemd-journald 才会生效;logrotate 通过 rotate 参数控制文本日志的保留份数,并不是直接按保留天数设置;Ja va 应用日志则应在日志框架配置中通过 maxHistory 等参数进行管理,例如 logback。

journalctl 默认保留策略在哪改
systemd journal 日志的默认保留策略并不是写死在系统里,而是主要通过 /etc/systemd/journald.conf 中的两个关键参数控制:SystemMaxUse 和 MaxRetentionSec。修改完成后,需要重启 journald 服务,新的日志保留配置才会正式生效。
很多人在 Ubuntu 修改日志清理保留天数时,常误以为只设置 MaxRetentionSec 就足够了。实际上,它更像是一个“时间上限”,真正影响清理行为的往往是磁盘空间限制(SystemMaxUse)与该参数的组合。若磁盘空间一直充足,MaxRetentionSec 可能不会立即触发旧日志删除。
- 打开配置:
sudo nano /etc/systemd/journald.conf - 取消注释并修改这两行(例如保留 14 天):
SystemMaxUse=500M MaxRetentionSec=14d
- 重启服务:
sudo systemctl restart systemd-journald - 验证是否加载:
sudo systemctl show --property=SystemMaxUse,MaxRetentionSec systemd-journald
logrotate 的保留天数怎么调
logrotate 主要用于管理传统的文本日志文件,例如 /var/log/syslog、/var/log/auth.log 等 syslog 日志。它的保留时间并不是直接通过“多少天”来精确控制,而是依靠配置中的 rotate 参数决定保留多少个归档文件。比如,rotate 7 表示最多保留 7 份归档;如果日志通常每天轮转一次,那么基本可以理解为大约保留 7 天日志。
如果想调整 Ubuntu 日志保留天数,可以直接修改 /etc/logrotate.d/rsyslog 或目标服务对应的 logrotate 配置文件。但要特别注意,轮转周期(daily/weekly)必须与 rotate 的数值搭配合理,否则就可能出现日志保留时间过短,甚至提前丢失历史日志的问题。
- 编辑配置:
sudo nano /etc/logrotate.d/rsyslog - 找到类似这一段,把
rotate 4改成需要的保留份数:/var/log/syslog { rotate 14 daily compress missingok create 640 root adm } - 立即生效:
sudo logrotate -f /etc/logrotate.conf - 检查效果:
ls -1 /var/log/syslog.* | wc -l(应 ≤14)
为什么改了配置还是删不掉旧日志
最容易踩坑的地方,就是把两套日志管理机制混为一谈:journalctl 管理的是二进制 journal 日志(/var/log/journal/),而 logrotate 管理的是文本 syslog 日志(如 /var/log/syslog)。如果改错了配置位置,自然无法达到删除旧日志或调整日志保留天数的目的。
另一个比较隐蔽的问题是,logrotate 配置中没有加 dateext 却设置了 daily,这可能导致归档文件名不带日期,从而影响 rotate 的判断逻辑。还有一种情况是启用了 copytruncate 却没有配置 notifempty,空日志文件同样会参与轮转,久而久之可能快速占满日志配额。
- 确认日志类型:
file /var/log/syslog(text) vsfile /var/log/journal/*(data) - 查 journal 实际占用:
journalctl --disk-usage - 查 logrotate 是否真执行过:
sudo logrotate -d /etc/logrotate.conf 2>&1 | grep "syslog"(加-d调试模式) - 注意
maxage和rotate冲突:如果同时设了maxage 30和rotate 7,以更严格的那个为准
Ja va 应用日志的保留天数别动系统配置
Ja va 应用程序自己输出的日志(例如 /opt/myapp/logs/app.log)通常由 logback、log4j2 等日志框架负责管理,与系统日志保留策略并不相同。若强行使用 logrotate 或 journalctl 去处理这类应用日志,往往会因为 Ja va 进程持续占用文件而失败,甚至引发日志丢失或切割异常。
更推荐的做法,是直接在应用自身的日志框架配置文件中设置滚动与保留策略。以 logback.xml 为例,可以通过如下配置实现按时间滚动并用 maxHistory 控制日志保留天数:
logs/app.%d{yyyy-MM-dd}.%i.log 100MB 30
如果确实需要借助系统级工具统一管理 Ja va 日志,务必确认 Ja va 进程已经正确设置 prudent=false(logback)或 append=true(log4j2),并且在 logrotate 中加入 copytruncate。否则在执行 truncate 后,正在写入的日志文件可能被清空,而 Ja va 程序又不会自动重建,最终影响日志连续性。
