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

Ste*_*ler 3 permissions log-files logging file-permissions tomcat9

我有一个 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
Run Code Online (Sandbox Code Playgroud)

如果我在我的 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()
    );
Run Code Online (Sandbox Code Playgroud)

它打印出没有写权限

user: tomcat
execute: true
read: true
write: false 
Run Code Online (Sandbox Code Playgroud)

如果我作为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()
        );
Run Code Online (Sandbox Code Playgroud)

它打印出它有写权限

user: tomcat
execute: true
read: true
write: true
Run Code Online (Sandbox Code Playgroud)

我已经用尽了我知道如何做的所有调试。是什么阻止了我的 Web 应用程序在 tomcat 9 下写入此目录?我需要做什么来修复它。

Ste*_*ler 7

这是由作为 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
Run Code Online (Sandbox Code Playgroud)

进行这些更改后,Web 应用程序可以再次写入自己的/var/log.

来源:Debian Tomcat 9 发行说明