SpringBoot内置支持的Web服务有Tomcat、Undertow、Jetty和Netty,默认情况下,这些Web服务的Access(访问)日志默认是不开启的,而Access(访问)日志对于我们做数据统计尤为重要。如果我们想开启这些日志,需要作如下配置:
1. 了解Tomcat容器日志配置
Spring Boot 2.x默认支持的是Tomcat Web容器,如果我们想开启Access日志,只需要添加若干配置文件即可:

server: 
  tomcat: 
    basedir: /opt/log/
    background-processor-delay: 30
    port-header: X-Forwarded-Port
    protocol-header: X-Forwarded-Proto
    protocol-header-https-value: https
    redirect-context-root: true
    remote-ip-header: X-Forwarded-For
    uri-encoding: UTF-8
    accesslog: 
      enabled: true
      buffered: true
      directory: ./log
      file-date-format: .yyyy-MM-dd
      pattern: '%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D ms'
      prefix: access_log
      rename-on-rotate: false
      request-attributes-enabled: false
      rotate: true
      suffix: .log

其中,以下属性是必须要配置的,如果不配置该属性,日志也是不会输出的
配置完毕,Access日志就会在/opt/log/目录下生成,名称是access_log.yyyy-MM-dd.log


server: 
  tomcat: 
    basedir: /opt/log/

2,Undertow容器日志配置
引入Undertow依赖包后,在配置文件添加如下配置(注意需要排除tomcat依赖包

		<!-- Undertow服务器 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-undertow</artifactId>
		</dependency>

可查看undertow官网: http://undertow.io/undertow-docs/undertow-docs-2.0.0/index.html#access-log-handler

了解到它的日志处理采用 AccessLogHandler类。
跟踪 AccessLogHandler 类的源码,查看 common和 combined的格式定义。

new io.undertow.server.handlers.accesslog.AccessLogHandler(new HttpHandler(), 
new AccessLogReceiver(), "", Test.class.getClassLoader());

可发现他的配置符合三种,一是common,二是combined,三是自定义。


private static String handleCommonNames(String formatString) {
        if(formatString.equals("common")) {
            return "%h %l %u %t \"%r\" %s %b";
        } else if (formatString.equals("combined")) {
            return "%h %l %u %t \"%r\" %s %b \"%{i,Referer}\" \"%{i,User-Agent}\"";
        }
        return formatString;

更多格式字符定义可在undertow官网查看: http://undertow.io/undertow-docs/undertow-docs-2.0.0/index.html#exchange-attributes-2

具体分析如下:

common日志格式: 
   %h %l %u %t \"%r\" %s %b
   %h: 远程主机名
   %l:  远程主机逻辑名: 经常是 -
   %u:   远程受信用户名: 经常是 -
   %t: 日期和时间,用 Common Log Format格式
   %r: Http请求的第一行
   %s: 响应状态码
   %b: 发送的字节数(不包括头域),如是 - 表明没有字节发送, 

combined日志格式: 
   %h %l %u %t \"%r\" %s %b \"%{i,Referer}\" \"%{i,User-Agent}\

   "%{i,Referer}\":   从http请求头中获取 来源地址
   %{i,User-Agent}:   从http请求头中获取 userAgent

博主项目中采用的是第三种 自定义:
%h %l %u %t “%r” %s %b %D “%{i,Referer}” "%{i,User-Agent}
因为用了 %D,记录请求所费时间, 所以要在config配置内中加入下面代码,开启undertow计时:

 @Bean
    public UndertowServletWebServerFactory undertowServletWebServerFactory() {
        UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
        factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {
            @Override
            public void customize(Undertow.Builder builder) {
                builder.setServerOption(UndertowOptions.RECORD_REQUEST_START_TIME, true);
            }
        });
        return factory;
    }

最后我们的配置文件名为application.yml,放在项目resource目录下,具体配置如下:

server:  
    port: 8080
    servlet: 
       session.timeout: 60000
       contextpath: /ycbike    
    undertow:  
        io-threads: 16  
        worker-threads: 256  
        buffer-size: 1024  
        buffers-per-region: 1024  
        direct-buffers: true 
        accesslog: 
            dir: ../log/access/
            enabled: true
            pattern: "%h %l %u %t \"%r\" %s %b %D \"%{i,Referer}\" \"%{i,User-Agent}\""
            prefix: ibike_access
            suffix: log
            rotate: true
        
logging:
    level: 
        root: info
        org.springframework: info
        com.yc: info
    file: ../log/run/ycbike.log
swagger: 
    enabled: false

想了解Jetty容器日志与Netty容器日志的具体配置,可参考以下这篇博客:https://blog.csdn.net/zhangyingchengqi/article/details/107251550

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐