Java服务在Ubuntu上日志丢失怎么办
导读:Java服务在 Ubuntu 上日志丢失的定位与修复 一、先快速定位日志的去向 确认是否由 systemd 托管:执行 systemctl status myapp.service,若看到 Loaded: loaded (/etc/sys...
Java服务在 Ubuntu 上日志丢失的定位与修复
一、先快速定位日志的去向
- 确认是否由 systemd 托管:执行
systemctl status myapp.service,若看到 Loaded: loaded (/etc/systemd/system/myapp.service),则应用日志可能走 journald。用journalctl -u myapp.service -b查看本次启动日志,或用journalctl -u myapp.service --since "2025-11-18 00:00:00"按时间检索。若服务配置了StandardOutput/StandardError指向文件,则继续下一步查文件。 - 查找应用日志文件:常见路径包括 /var/log/(如 /var/log/tomcatX/、/var/log/java/)、应用安装目录下的 logs/(如 /opt/myapp/logs/app.log)。可用
find /opt/myapp -name "*.log"或grep -R "logging.path" /opt/myapp/conf定位日志配置与目录。 - 若应用使用 Logback/Log4j2,在配置中查找 fileName/filePattern、RollingFileAppender、TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy 等关键字,确认滚动与保留策略。
二、常见根因与对应修复
- 日志轮转后未正确“接管”新文件
- 现象:轮转后应用继续写旧 inode,新文件为空或不增长。
- 修复:
- 使用 logrotate 的
copytruncate让应用无感继续写原文件:
/var/log/myapp/*.log {
daily; rotate 7; compress; missingok; notifempty;
copytruncate; create 640 root adm
} - 或在
postrotate中向应用发送信号让其重新打开日志(如 kill -HUP 或应用支持的 reopen 信号),并确保postrotate脚本退出码为 0。
- 使用 logrotate 的
- 应用日志框架未配置滚动与保留
- 现象:单文件无限增长后被外部清理或截断,历史日志缺失。
- 修复:在 Logback/Log4j2 中启用基于时间与大小的滚动,并设置保留份数(见下文示例)。
- systemd 日志被自动清理或空间受限
- 现象:
journalctl -u myapp.service只能看到最近少量日志。 - 修复:调整 /etc/systemd/journald.conf(如
SystemMaxUse=500M、SystemMaxFiles=5),执行systemctl restart systemd-journald;必要时用journalctl --vacuum-size=500M或--vacuum-time=7d清理历史。
- 现象:
- 权限或目录不存在导致写入失败
- 现象:应用启动后无日志或报错 “Permission denied”。
- 修复:确认日志目录存在且属主/权限正确(如
chown -R myapp:myapp /var/log/myapp),并确保应用用户对目录有 写权限。
- 被外部脚本/定时任务误删或清空
- 现象:日志突然消失或变为 0 字节。
- 修复:排查 cron 与清理脚本(如
find ... -mtime +30 -delete)、运维操作记录;建议统一通过 logrotate 管理,避免直接rm或> file。
三、可直接落地的配置示例
- 使用 logrotate 管理应用日志(推荐)
- 创建 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
create 640 myapp myapp
copytruncate
} - 测试与生效:
logrotate -d /etc/logrotate.d/myapp(干跑),logrotate -f /etc/logrotate.d/myapp(强制执行)。
- 创建 /etc/logrotate.d/myapp:
- 使用 systemd journald 管理服务日志
- 编辑 /etc/systemd/journald.conf 或 /etc/systemd/journald.conf.d/50-default.conf:
[Journal]
SystemMaxUse=500M
SystemKeepFree=100M
SystemMaxFileSize=50M
SystemMaxFiles=5 - 应用:
systemctl restart systemd-journald;查看:journalctl -u myapp.service -f。
- 编辑 /etc/systemd/journald.conf 或 /etc/systemd/journald.conf.d/50-default.conf:
- 使用 Log4j2 RollingFileAppender(按天+按大小滚动,保留 7 天)
- 示例要点:
%d %p %c{ 1.} [%t] %m%n
- 示例要点:
- 使用 Logback TimeBasedRollingPolicy(按天滚动,保留 30 天)
- 示例要点:
logs/app-%d{ yyyy-MM-dd} .log
30
- 示例要点:
- 将 System.out/err 重定向到文件(可选,systemd 场景)
- 在 /etc/systemd/system/myapp.service.d/override.conf:
[Service]
StandardOutput=append:/var/log/myapp/stdout.log
StandardError=append:/var/log/myapp/stderr.log
SyslogIdentifier=myapp - 应用:
systemctl daemon-reload & & systemctl restart myapp.service。
- 在 /etc/systemd/system/myapp.service.d/override.conf:
四、日常巡检与防护清单
- 巡检
- 查看占用:
journalctl --disk-usage;du -sh /var/log/myapp/。 - 校验轮转:
ls -l /var/log/myapp/,确认出现 .gz 归档且当前日志在增长。 - 权限核对:
namei -l /var/log/myapp/app.log检查属主与权限链路。
- 查看占用:
- 防护
- 统一用 logrotate 或日志框架做滚动与保留,避免脚本直接删除。
- 为关键业务开启 systemd 持久化日志或外接 ELK/Graylog,降低单点丢失风险。
- 对大文件场景启用 按天+按大小 双触发策略,并合理设置保留份数(如 7–30 天)。
- 变更前后保留回滚方案,变更窗口内观察日志是否正常滚动与落盘。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Java服务在Ubuntu上日志丢失怎么办
本文地址: https://pptw.com/jishu/749828.html
