journalctl 日志保留策略由 /etc/systemd/journald.conf 中 systemmaxuse 和 maxretentionsec 共同控制,需重启 systemd-journald 生效;logrotate 通过 rotate 参数控制文本日志份数,非直接设天数;java 应用日志应由其日志框架(如 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,以更严格的那个为准
Java 应用日志的保留天数别动系统配置
Java 进程自己打的日志(比如 /opt/myapp/logs/app.log)通常由 logback 或 log4j2 控制,跟系统日志无关。强行用 logrotate 或 journalctl 去管,容易因文件被 Java 进程独占而失败,或造成日志丢失。
正确做法是在应用自己的日志框架配置里设滚动策略,例如 logback.xml 中:
<rollingpolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><filenamepattern>logs/app.%d{yyyy-MM-dd}.%i.log</filenamepattern><timebasedfilenamingandtriggeringpolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxfilesize>100MB</maxfilesize></timebasedfilenamingandtriggeringpolicy><maxhistory>30</maxhistory><!-- 这才是真正的保留天数 --></rollingpolicy>
如果非要用系统级工具统一管理,确保 Java 进程已配置 prudent=false(logback)或 append=true(log4j2),且 logrotate 加了 copytruncate —— 否则 truncate 会清空正在写的文件,Java 不会自动重建。











