首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/dev/stdout权限被拒绝Tomcat访问日志

/dev/stdout权限被拒绝Tomcat访问日志
EN

Stack Overflow用户
提问于 2020-09-02 21:06:04
回答 3查看 446关注 0票数 2

我试图在STS控制台中启用Tomcat访问日志,但在启动时出现错误:

代码语言:javascript
复制
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)

application.yml:

代码语言:javascript
复制
  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的权限,但我不确定如何将它列入白名单,如何授予它访问权限。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-03 20:40:39

使用以下命令将dev文件夹的所有权授予当前用户:

代码语言:javascript
复制
sudo chown -R $USER dev/

使用以下命令将文件夹的组所有者更改为当前用户:

代码语言:javascript
复制
sudo chgrp -R $USER dev/

这个应该可以解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2020-09-02 21:10:08

我会说你的问题不是在你的代码中,而是在你的服务器上。

显然,它是Linux或Unix。因此,使用chmod命令来更改您的用户可以对此文件夹执行的操作。

票数 1
EN

Stack Overflow用户

发布于 2021-02-06 16:16:02

正如您所看到的,Tomcat正在尝试打开文件/dev/stdout.2020-09-02而不是/dev/stdout。这背后的原因是空的file-data-format表示default format for your locale。如果要禁止在文件名中添加日期,则需要使用:

代码语言:javascript
复制
rotatable: false

另一方面,这将根据标准输出是否是文件将您的日志重定向到标准输出: Java不复制文件描述符1,但在/dev/stdout上调用open。检查this answer,了解为什么它不能在管道/套接字上工作。

要实现您想要的功能,您需要修改AccessLogValve#open方法

代码语言:javascript
复制
    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;
        }
        ...
    }

并将-设置为日志文件的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63706170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档