Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让Spring Boot发送嵌入式Tomcat';s对标准输出的访问日志?_Tomcat_Logging_Spring Boot_Stdout - Fatal编程技术网

如何让Spring Boot发送嵌入式Tomcat';s对标准输出的访问日志?

如何让Spring Boot发送嵌入式Tomcat';s对标准输出的访问日志?,tomcat,logging,spring-boot,stdout,Tomcat,Logging,Spring Boot,Stdout,在独立的Spring Boot web应用程序(可执行jar)中,您如何告诉Spring Boot我们希望将嵌入式Tomcat实例的HTTP访问日志发送到stdout?如果您使用Logback,您可以使用它 添加依赖项ch.qos.logback:logback访问 用于添加TeeFilter(请求和响应日志记录)的可选Javaconfig: 嵌入式tomcat的Javaconfig: @Bean public EmbeddedServletContainerFactory servletCon

在独立的Spring Boot web应用程序(可执行jar)中,您如何告诉Spring Boot我们希望将嵌入式Tomcat实例的HTTP访问日志发送到stdout?

如果您使用Logback,您可以使用它

添加依赖项
ch.qos.logback:logback访问

用于添加TeeFilter(请求和响应日志记录)的可选Javaconfig:

嵌入式tomcat的Javaconfig:

@Bean
public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();

    // put logback-access.xml in src/main/resources/conf
    tomcat.addContextValves(new LogbackValve());

    return tomcat;
}
logback access.xml的内容(保存在
src/main/resources/conf


合二为一
%完整请求%n%n%fullResponse

以下是JohanB关于Spring Boot 2.0.0+的伟大答案的后续内容

在SpringBoot2.0.0中,
EmbeddedServletContainerFactory
TomcatServletWebServerFactory
取代。JohanB答案的所有其他方面仍然正常工作工厂bean创建只需修改:

@Bean
public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    // put logback-access.xml in src/main/resources/conf
    tomcat.addContextValves(new LogbackValve());
    return tomcat;
}

这在Spring Boot 2.x上为我做到了:

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.directory=/dev
server.tomcat.accesslog.prefix=stdout
server.tomcat.accesslog.buffered=false
server.tomcat.accesslog.suffix=""
server.tomcat.accesslog.file-date-format=""
更新日期2019.02.11: 这些墨水对于映射应在
应用程序中设置的属性非常有用。属性


@A答案稍微正确。如果您提供空的双引号,它将不起作用。我将扩展他的答案,因为我认为这对于那些不想添加依赖项或修改代码的人来说很重要:

config/application.properties
#这里我们说要启用accesslog
server.tomcat.accesslog.enabled=true
#了解这些选项的含义非常重要:
#“目录/前缀+后缀+文件日期格式”将被删除
#tomcat将尝试打开的文件。
#/dev/stdout是标准输出,所以我们需要tomcat
#给那个fd写信。然后,我们需要玩游戏
#目录、前缀、后缀和文件日期格式,以匹配我们所需的路径。
server.tomcat.accesslog.directory=/dev
server.tomcat.accesslog.prefix=stdout
server.tomcat.accesslog.buffered=false
#不要使用空双引号,请参见下文
server.tomcat.accesslog.suffix=
server.tomcat.accesslog.file-date-format=
笔记
  • 如果将
    文件日期格式
    后缀
    设置为双引号,则会出现以下错误:
  • 如果未在配置文件中包含它们,则将使用默认值,并出现以下错误:
  • 如果你让它们空着,那么它就会起作用

  • JohanB的解决方案是可行的,但如果您不想编写代码,则有人会做得更好,并进行包装。它包括Tomcat、码头和底拖

    只需添加依赖项:

    
    net.rakugakibox.spring.boot
    
    如果要打印完整的HTTP请求和响应以进行调试。

    我认为您只需要将日志记录级别设置为debug,因为spring和tomcat日志默认设置为info。日志将具有完全限定的类名,以便您知道日志的来源。@RahulSharma日志级别对appender输出位置(例如文件、标准输出、URL等)没有任何影响。我们需要所有输出(包括Tomcat访问日志)才能转到标准输出。除了Tomcat之外的所有东西都很简单,但是Tomcat日志很难。对不起,我以为你想看到100%的日志。默认情况下,spring引导会将日志写入控制台,所以我不知道您为什么看不到它们。另外,您是否正在使用嵌入式tomcat?如果是,请查看嵌入式服务器属性,我们确实使用了Logback,并且已经使用了控制台appender:)缺少的部分是
    TomcatEmbeddedServletContainerFactory
    bean配置。回答得好!在Spring Boot中,它将尝试将阀文件名作为类路径资源查找-如果文件名文本中有“src/main/resources”,它将无法找到它。更好的方法是将
    logback access.xml
    文件放在
    src/main/resources/conf
    下。从文档中:默认情况下,LogbackValve在server.xml所在的同一文件夹中查找名为logback-access.xml的配置文件,该文件夹位于$TOMCAT_HOME/conf/。我尝试了undertow,它仍然表示无法创建访问日志目录“logs”。我使用了server.undertow.accesslog.directory=/dev@ravthiru我不熟悉undertow,也许我猜undertow的选项是
    dir
    (因为方法是
    getDir()
    ),而不是
    directory
    。这只是一个猜测,告诉我是怎么回事:)我在docker容器中运行应用程序,所以我用前缀“1”写入目录/proc/1/fd,但出于某种原因,它在它前面添加了“management”。无法打开访问日志文件[/proc/1/fd/management\u 1]@AFP\u 555我也在docker内部运行此文件。不确定为什么要在
    管理
    前面加前缀。听起来像是记录器配置。你有一个有效的例子吗?@Sebastian它显示了这个错误,但后来一切都按预期进行了。虽然不看到这个错误会很好。我认为原因是我们使用的是嵌入式服务器的“management.*”配置。您是否在pivotal/cf上运行此配置?
    application.yml的完整示例:如何使用此配置?i、 例如,我把它放在哪里?你必须把它放在一个Java类中,在类上加上@Configuration注释,以便Spring加载在其中定义的bean
    
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        // put logback-access.xml in src/main/resources/conf
        tomcat.addContextValves(new LogbackValve());
        return tomcat;
    }
    
    server.tomcat.accesslog.enabled=true
    server.tomcat.accesslog.directory=/dev
    server.tomcat.accesslog.prefix=stdout
    server.tomcat.accesslog.buffered=false
    server.tomcat.accesslog.suffix=""
    server.tomcat.accesslog.file-date-format=""
    
    java.io.FileNotFoundException: /dev/stdout"""" (Permission denied)
    
    
    java.io.FileNotFoundException: /dev/stdout.2019-02-07.log (Permission denied)
    
    <configuration>
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>common</pattern>
            </encoder>
        </appender>
        <appender-ref ref="CONSOLE" />
    </configuration>
    
    127.0.0.1 - - [08/févr./2019:11:23:30 +0100] "GET /password HTTP/1.1" 200 32