Tomcat 9 下的应用程序日志记录中断:/var/log/myapp 的权限被拒绝

Tomcat 9 下的应用程序日志记录中断:/var/log/myapp 的权限被拒绝

我有一个 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

来源:Debian Tomcat 9 发行说明

答案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

相关内容