我有一个 Java webapp,它在 Ubuntu Linux 上的 Apache Tomcat 下运行。当我从 Tomcat 8 升级到 Tomcat 9 时,该应用程序不再能够将日志文件写入/var/log/myapp
。我不明白为什么它没有权限记录到这个位置。
我首先想到的是用户发生了变化。Tomcat 8 在tomcat8:tomcat8
用户下运行。Tomcat 9 在tomcat:tomcat
用户下运行。我使用这些权限更新了目录。tomcat
用户和tomcat
组都具有写权限。
我还检查了该目录的写入和执行权限。该目录具有写入和执行权限,并且所有父目录都具有执行权限。
/var/log/myapp/ drwxrwxr-x tomcat tomcat
/var/log drwxrwxr-x root syslog
/var drwxr-xr-x root root
/ drwxr-xr-x root root
如果我在我的 Web 应用程序下运行以下代码
File logdir = new File("/var/log/myapp");
setAttribute("debug",
"<br>user: " + System.getProperty("user.name") +
"<br>execute: " + logdir.canExecute() +
"<br>read: " + logdir.canRead() +
"<br>write: " + logdir.canWrite()
);
打印出没有写权限
user: tomcat
execute: true
read: true
write: false
如果我在主方法中运行与tomcat
用户类似的代码
File logdir = new File("/var/log/myapp");
System.out.println("\n user: " + System.getProperty("user.name") +
"\n execute: " + logdir.canExecute() +
"\n read: " + logdir.canRead() +
"\n write: " + logdir.canWrite()
);
它打印出它具有写权限
user: tomcat
execute: true
read: true
write: true
我已经用尽了我所知道的所有调试方法。是什么阻止我的 Web 应用程序在 tomcat 9 下写入此目录?我需要做什么来修复它。
答案1
这是由于 Debian/Ubuntu 中围绕 tomcat 9 的新 systemd 沙盒所致。要解决此问题,您需要告诉 systemd 允许 Tomcat 对其他目录进行读写访问。
sudo mkdir -p /etc/systemd/system/tomcat9.service.d
echo -e "[Service]\nReadWritePaths=/var/log/" | sudo tee /etc/systemd/system/tomcat9.service.d/logging-allow.conf
sudo systemctl daemon-reload
sudo systemctl restart tomcat9
进行这些更改后,Web 应用程序可以再次写入 中的自己的目录/var/log
。
答案2
Stephen Ostermiller 的答案解决了这个问题。
另一种方法是:
systemctl edit tomcat9.service
普京
[Service]
ReadWritePaths=/var/log/
这将写入 /etc/systemd/system/tomcat9.service.d/override.conf。
然后执行
systemctl daemon-reload
systemctl restart tomcat9.service
你可以使用
systemctl revert tomcat9.service