Разрешение /dev/stdout запрещено Журналы доступа Tomcat

Я пытаюсь включить журналы доступа Tomcat в консоли STS, но при запуске получаю сообщение об ошибке:

java.io.FileNotFoundException: /dev/stdout.2020-09-02 (Permission denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at org.apache.catalina.valves.AccessLogValve.open(AccessLogValve.java:585)
at org.apache.catalina.valves.AccessLogValve.startInternal(AccessLogValve.java:615)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:182)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:953)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:344)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:99)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:84)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:552)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:177)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:164)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1187)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1176)
at au.com.paycorp.rest.ws.Application.main(Application.java:29)

приложение.yml:

  server:
    port: 50110
    contextPath: /rest
    tomcat:
      accesslog:
        enabled: true
        directory: "/dev"
        prefix: stdout
        buffered: false
        suffix:
        file-date-format:
        pattern: "[ACCESS] %{org.apache.catalina.AccessLog.RemoteAddr}r %l %t %D %F %B %S vcap_request_id:%{X-Vcap-Request-Id}i"

Я понимаю, что у него нет разрешения на запись в /dev/stdout, но я не уверен, как внести его в белый список, как дать ему разрешение на доступ.


person isotronic    schedule 02.09.2020    source источник


Ответы (3)


Передайте право собственности на папку dev текущему пользователю с помощью:

sudo chown -R $USER dev/

Измените владельца группы папки на текущего пользователя с помощью этой команды:

sudo chgrp -R $USER dev/

Это должно исправить это.

person Abdulah Pehlic    schedule 03.09.2020
comment
Я действительно не стал бы этого делать, так как папка /dev содержит специальные устройства, и никто бы не хотел, чтобы Tomcat мог создавать и удалять файлы здесь. Кроме того, в сообщении об ошибке говорится, что Tomcat пытался создать /dev/stdout.2020-09-02, что не является стандартным устройством вывода. - person Piotr P. Karwasz; 06.02.2021

Я бы сказал, что проблема не в вашем коде, а на вашем сервере.

Очевидно, это Linux или Unix. Итак, используйте команду chmod, чтобы изменить то, что ваш пользователь может делать с этой папкой.

person BenjaminD    schedule 02.09.2020

Как видите, Tomcat пытается открыть файл /dev/stdout.2020-09-02 вместо /dev/stdout. Причина этого в том, что пустое file-data-format означает формат по умолчанию для вашей локали. Если вы хотите отключить добавление даты в имя файла, вам нужно использовать:

rotatable: false

С другой стороны, это перенаправит ваши журналы на стандартный вывод в зависимости от того, является ли стандартный вывод файлом или нет: Java не дублирует файловый дескриптор 1, а вызывает open на /dev/stdout. Проверьте этот ответ, чтобы понять, почему он не работает с каналами/сокетами.

Чтобы добиться того, чего вы хотите, вам нужно изменить метод AccessLogValve#open:

    protected synchronized void open() {
        // Open the current log file
        // If no rotate - no need for dateStamp in fileName
        File pathname = getLogFile(rotatable && !renameOnRotate);
        // Modify HERE:
        if ("-".equals(pathname)) {
            writer = System.out;
            return;
        }
        ...
    }

и установите - в качестве имени вашего файла журнала.

person Piotr P. Karwasz    schedule 06.02.2021