web-dev-qa-db-ja.com

Tomcat 9で壊れたアプリケーションロギング:/ var / log / myappへのアクセスが拒否されました

Java webappがUbuntu LinuxのApache Tomcatで実行されています。Tomcat9からTomcat 8にアップグレードすると、アプリケーションは/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サンドボックス化が原因です。この問題を解決するには、Tomcatの追加ディレクトリへの読み取り書き込みアクセスを許可するようにsystemdに指示する必要があります。

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