CentOS 上 Java 日志丢失通常不是单一原因,而是日志框架、系统配置、进程运行方式、磁盘/权限等多个因素叠加导致的。下面按最常见 → 较少见的顺序系统梳理原因和排查方法。
Java 进程不会自动创建目录,目录不存在或不可写时日志直接丢失。
排查
ls -ld /path/to/log
sudo -u <java_user> touch /path/to/log/test.log
解决
mkdir -p /path/to/log
chown -R java_user:java_user /path/to/log
chmod 755 /path/to/log
systemd 默认会把 stdout/stderr 接管。
现象
systemctl start app 就没有日志原因
stdoutStandardOutput / StandardError解决
# *.service
StandardOutput=append:/var/log/app/app.log
StandardError=append:/var/log/app/error.log
或让 Java 日志框架直接写文件(推荐)。
配置文件没加载或路径错误。
常见坑
logback.xml / log4j2.xml 不在 classpath./logs/app.log)排查
ps -ef | grep java
# 看是否包含
-Dlogging.config= 或 -Dlogback.configurationFile=
建议
systemd 默认不保留长日志。
排查
journalctl -u your-service --since "10 min ago"
解决
df -h
现象
解决
df -i
现象
getenforce
如果是 Enforcing:
ausearch -m avc -ts recent
解决
semanage fcontext -a -t var_log_t "/var/log/app(/.*)?"
restorecon -Rv /var/log/app
或临时验证:
setenforce 0
现象
解决
neverBlock=falseps -ef | grep java
看到类似:
java ... > /dev/null 2>&1
解决
kill -15date
java -XshowSettings:all
# 1️⃣ 磁盘
df -h
df -i
# 2️⃣ 权限
namei -l /var/log/app/app.log
# 3️⃣ 进程
ps -ef | grep java
# 4️⃣ systemd
journalctl -u your-service -f
# 5️⃣ 日志配置
find / -name logback.xml 2>/dev/null
find / -name log4j2.xml 2>/dev/null
✅ 不要只依赖 stdout
✅ 日志路径用绝对路径
✅ 目录提前创建并授权
✅ systemd 下显式配置日志输出
✅ 开启日志滚动(按大小/时间)
✅ 生产环境关闭 async 验证问题
如果你愿意,可以直接贴:
我可以精准定位你这个环境的具体原因。