如何让Spring Boot发送嵌入式Tomcat';s对标准输出的访问日志?
在独立的Spring Boot web应用程序(可执行jar)中,您如何告诉Spring Boot我们希望将嵌入式Tomcat实例的HTTP访问日志发送到stdout?如果您使用Logback,您可以使用它 添加依赖项如何让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
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