在一个独立的春天启动的Web应用程序(可执行的JAR文件),你怎么告诉Spring启动,我们要发送嵌入的Tomcat实例的HTTP访问日志到标准输出?
如果你使用的logback,您可以使用logback-access这一点。
添加依赖ch.qos.logback:logback-access
可选Javaconfig添加TeeFilter(请求响应&记录):
@Bean(name = "TeeFilter")
public Filter teeFilter() {
return new ch.qos.logback.access.servlet.TeeFilter();
}
Javaconfig嵌入式的Tomcat:
@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
)
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>combined</Pattern>
<Pattern>%fullRequest%n%n%fullResponse</Pattern>
</encoder>
</appender>
<appender-ref ref="STDOUT" />
</configuration>
这些油墨应该是有用的地图,你应该在application.properties
设置其属性:
@acohen的答案是正确的轻微。如果您提供的空双引号将无法正常工作。因为我认为这是不希望惹添加依赖或修改代码的人谁重要,我会延长他的答案:
# here we say that we want to enable accesslog
server.tomcat.accesslog.enabled=true
# it is important to understand what the options means:
# 'directory/prefix + suffix + file-date-format' will be
# the file that tomcat will try to open.
# /dev/stdout is standard output, so we want tomcat
# to write to that fd. Then, we need to play with
# directory, prefix, suffix and file-date-format to match our desired path.
server.tomcat.accesslog.directory=/dev
server.tomcat.accesslog.prefix=stdout
server.tomcat.accesslog.buffered=false
# Don't use empty double quotes, see below
server.tomcat.accesslog.suffix=
server.tomcat.accesslog.file-date-format=
file-date-format
和suffix
是双引号,你都会有这样的错误:java.io.FileNotFoundException: /dev/stdout"""" (Permission denied)
java.io.FileNotFoundException: /dev/stdout.2019-02-07.log (Permission denied)
这为我做的春季启动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=""
下面是从JohanB伟大的答案随访了,因为春天引导2.0.0+。
在春季启动2.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;
}
JohanB的解决方案的工作,但如果你不想写代码,有人做的更好,包裹Server access logs in a nice Spring Boot starter。它涵盖的Tomcat,Jetty和暗潮。
只需添加依赖关系:
<dependency>
<groupId>net.rakugakibox.spring.boot</groupId>
<artifactId>logback-access-spring-boot-starter</artifactId>
<version>2.7.1</version>
</dependency>
而在类路径根的logback-access.xml文件:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>common</pattern>
</encoder>
</appender>
<appender-ref ref="CONSOLE" />
</configuration>
和访问日志被印刷到stdout:
127.0.0.1 - - [08/févr./2019:11:23:30 +0100] "GET /password HTTP/1.1" 200 32
在这一点上,你需要create the TeeFilter
Bean on your own如果你要打印完整的HTTP请求和响应进行调试。