在 CentOS 上 Java 日志“丢失”是很常见的问题,通常不是真的没了,而是被其他机制接管、覆盖、清理或写错地方了。下面按最常见原因给你系统梳理一下。
java -jar app.jar 或 systemctl start xxxjournalctl -u 服务名 里却能看到CentOS 7+ 默认使用 systemd + journald
方式1:看 journal 日志
journalctl -u your-service -f
方式2:禁止 journal 接管
mkdir -p /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/override.conf <<EOF
[Journal]
ForwardToSyslog=yes
EOF
systemctl restart systemd-journald
方式3:服务里明确重定向
[Service]
StandardOutput=append:/var/log/app/app.out.log
StandardError=append:/var/log/app/app.err.log
/etc/logrotate.d/ 里配置了:
missingoknotifemptypostrotate 没通知 Java 重新打开文件/var/log/app/*.log {
daily
rotate 7
missingok
notifempty
copytruncate # ← 很多 Java 程序必须有这个
}
✅ Java 程序一定要 copytruncate 或支持日志重开
ls -ld /var/log/app
ps -ef | grep java
getenforce
chown -R appuser:appuser /var/log/app
setenforce 0 # 临时关闭测试
或加 SELinux 规则:
semanage fcontext -a -t var_log_t "/var/log/app(/.*)?"
restorecon -Rv /var/log/app
logback.xml 没生效java -jar app.jar --debug
确认:
System.out.printlnBufferedOutputStreamkill -9immediateFlush=true(Logback)df -h
df -i
# 1. 看 systemd 日志
journalctl -u 服务名 -n 100
# 2. 看进程实际输出
ls -l /proc/$(pgrep java)/fd
# 3. 看 logrotate
cat /etc/logrotate.d/*
# 4. 看磁盘
df -h; df -i
如果你愿意,可以告诉我:
我可以直接帮你定位到是哪一条原因 + 给精确配置。