你怎么知道春天启动发送嵌入式Tomcat的访问日志到标准输出?

问题描述 投票:8回答:5

在一个独立的春天启动的Web应用程序(可执行的JAR文件),你怎么告诉Spring启动,我们要发送嵌入的Tomcat实例的HTTP访问日志到标准输出?

tomcat logging spring-boot stdout
5个回答
12
投票

如果你使用的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>

6
投票

更新2019年2月11日:

这些油墨应该是有用的地图,你应该在application.properties设置其属性:


@acohen的答案是正确的轻微。如果您提供的空双引号将无法正常工作。因为我认为这是不希望惹添加依赖或修改代码的人谁重要,我会延长他的答案:

配置/ application.properties

# 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=

Notes

  1. 如果设置file-date-formatsuffix是双引号,你都会有这样的错误:
java.io.FileNotFoundException: /dev/stdout"""" (Permission denied)

  1. 如果你不包括他们在配置文件中,您将采用默认选项的值,但此错误:
java.io.FileNotFoundException: /dev/stdout.2019-02-07.log (Permission denied)
  1. 如果你离开他们空的,那么它会工作。

5
投票

这为我做的春季启动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=""

1
投票

下面是从JohanB伟大的答案随访了,因为春天引导2.0.0+。

在春季启动2.0.0,该EmbeddedServletContainerFactoryTomcatServletWebServerFactory取代。 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;
}

0
投票

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请求和响应进行调试。

© www.soinside.com 2019 - 2024. All rights reserved.