在 CentOS 上 Java 程序日志不写(不生成、不更新),通常不是 Java 本身的问题,而是 环境、权限、路径或配置 导致的。下面按最常见原因 → 排查思路 → 解决方案给你一个系统性的排查清单。
Java 不会自动创建目录,只创建文件。
FileAppender / RollingFileAppender
log.path = /var/log/myapp/app.log
如果 /var/log/myapp/ 不存在 → 日志直接失败,不报错
✅ 解决:
mkdir -p /var/log/myapp
chown -R 应用用户:应用用户 /var/log/myapp
CentOS 默认安全策略较严。
ls -ld /var/log/myapp
✅ 解决:
chmod 755 /var/log/myapp
chown appuser:appuser /var/log/myapp
如果是 systemd 启动:
[Service]
User=appuser
如果你用:
java -jar app.jar
并且 没配置日志文件,日志只会到:
journalctl -u your-service
✅ 解决:
java -jar app.jar > /var/log/app.log 2>&1
<file>/var/log/myapp/app.log</file>
❌ 错误示例:
<file>./logs/app.log</file>
在 systemd 里 ./ 可能是 /
✅ 建议:
<property name="LOG_PATH" value="/var/log/myapp"/>
<configuration debug="true">
或启动时加:
-Dlogback.debug=true
检查:
<RollingFile name="File" fileName="/var/log/myapp/app.log">
✅ 确认:
status="OFF"CentOS 默认开启 SELinux。
✅ 排查:
getenforce
如果是 Enforcing:
audit2why -a
✅ 临时验证:
setenforce 0
如果日志立刻能写 → 就是 SELinux
✅ 正确做法(不关 SELinux):
semanage fcontext -a -t var_log_t "/var/log/myapp(/.*)?"
restorecon -Rv /var/log/myapp
[Service]
PrivateTmp=true
日志可能写到了:
/tmp/systemd-private-xxx/
✅ 解决:
/tmp# 1. 日志目录是否存在
ls /var/log/myapp
# 2. 权限
ls -ld /var/log/myapp
# 3. SELinux
getenforce
# 4. Java 是否真的启动
ps -ef | grep java
# 5. systemd 日志
journalctl -u your-service -f
/opt/app/
├── app.jar
├── logs/
└── logback.xml
<configuration>
<property name="LOG_PATH" value="/opt/app/logs"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
你可以直接贴:
1️⃣ 启动方式(systemd / nohup / 手动)
2️⃣ 日志框架 + 配置文件
3️⃣ 日志路径
4️⃣ ls -ld 日志目录 输出
我可以 直接告诉你哪一行导致日志不写 ✅