Назад | Перейти на главную страницу

Ведение журнала приложения нарушено под Tomcat 9: отказано в разрешении для / var / log / myapp

У меня есть веб-приложение Java, которое работает под Apache Tomcat в Ubuntu Linux. Когда я обновился с Tomcat 9 с 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

Если я запустил следующий код в своем веб-приложении

    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

Я исчерпал всю отладку, которую умею делать. Что мешает моему веб-приложению записывать в этот каталог под tomcat 9? Что мне нужно сделать, чтобы это исправить.

Это вызвано новой изолированной программной средой systemd вокруг tomcat 9 как части Debian / Ubuntu. Чтобы решить эту проблему, вам нужно указать 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

После внесения этих изменений веб-приложения могут снова писать в свои собственные каталоги в /var/log.

Источник: Заметки о выпуске Debian Tomcat 9

Ответ Стивена Остермиллера решает проблему.
Другой способ сделать это:

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