journalctl 日志保留策略由 /etc/systemd/journald.conf 中 SystemMaxUse 和 MaxRetentionSec 共同控制,需重启 systemd-journald 生效;logrotate 通过 rotate 参数控制文本日志份数,非直接设天数;Ja va 应用日志应由其日志框架(如 logback)配置 maxHistory 管理。

journalctl 默认保留策略在哪改
systemd journal 日志的默认保留策略不靠配置文件硬编码,而是由 /etc/systemd/journald.conf 中的两个参数控制:SystemMaxUse 和 MaxRetentionSec。改完必须重启 journald 才生效。
常见误区是以为只设 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 负责管理的是传统的 syslog 日志文件,比如 /var/log/syslog、/var/log/auth.log 这类。它的保留时长并不是直接按“天数”来算,而是由配置文件中的 rotate 参数控制,准确说是按“保留多少份归档”来决定。举个例子,rotate 7 的意思是最多保留 7 个归档文件;如果通常每天轮转一次,那大致就相当于保留 7 天。
直接改 /etc/logrotate.d/rsyslog 或对应服务的配置即可,但要注意:轮转周期(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 里,可以这样配置:
logs/app.%d{yyyy-MM-dd}.%i.log 100MB 30
如果非要用系统级工具统一管理,确保 Ja va 进程已配置 prudent=false(logback)或 append=true(log4j2),且 logrotate 加了 copytruncate —— 否则 truncate 会清空正在写的文件,Ja va 不会自动重建。