相关推荐recommended
springboot
作者:mmseoamin日期:2024-02-03

springboot_tomcat开启access log日志,监控打印每个请求地址和响应时间

    • 一、前言
    • 二、环境
    • 三、配置对应的对象信息
    • 四、AccessLog配置默认值及说明
    • 五、配置实例
    • 六、pattern参数组成说明
    • 七、常用的pattern配置
      • 7.1 pattern默认值
      • 7.2 默认配置说明
      • 7.3 打印请求、响应中cookie、header中的内容
      • 八、总结

        一、前言

        springboot 1.x 内置tomcat服务器,其中的access log日志可以记录每次请求、响应的一些关键信息,这为我们排查分析系统性能有很大的帮助。

        但springboot默认是不开启access log的,下面介绍下access log的开启方式和一些日志格式配置。

        二、环境

        • jdk 8
        • srpingboot 1.56
        • windows 10

          三、配置对应的对象信息

          springboot的每个yml文件中的配置项,都会有与之对应的一个java对象与之对应,对象上一般使用@ConfigurationProperties注解自动加载配置,如果没有在yml中显示的加入配置项,该类也可以提供默认的阈值。tomcat的access log配置也有相应的配置类。如下:

          package org.springframework.boot.autoconfigure.web;
          ...
          @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
          public class ServerProperties
          		implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
          	public static class Tomcat {
                  public static class Accesslog {
                      ...
                  }
              }
          }
          
          • jar包:spring-boot-autoconfigure-1.5.6.RELEASE.jar
            • 配置类:org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat.Accesslog
              • 该类是个内部类位置是:org.springframework.boot.autoconfigure.web.ServerProperties -> Tocat -> Accesslog

                通过分析ServerProperties对象,我们可以知道access log在yml中的配置路径,即:server.tomcat.accesslog 。

                四、AccessLog配置默认值及说明

                属性默认值说明
                enabledfalse开启访问日志。
                pattern“common”访问日志的格式模式。
                directory“logs”创建日志文件的目录。可以是相对于tomcat基本目录或绝对目录。
                prefix“access_log”日志文件名前缀。
                suffix“.log”日志文件名后缀。
                rotatetrue默认为true。这个参数决定是否需要切换切换日志文件,如果被设置为false,则日志文件不会切换,即所有文件打到同一个日志文件中,并且fileDateFormat参数也会被忽略。小心使用这个参数。
                renameOnRotatefalse是否推迟将日期戳包含在文件名中,为true的情况下当天的日志文件是没有日期后缀的(如:access_log.txt),每天日期切换时,当天文件重命名为前一天日期后缀,同时新生成当天文件。
                fileDateFormat“.yyyy-MM-dd”日志文件名称中的日期格式,默认为.yyyy-MM-dd。
                requestAttributesEnabledfalse为请求设置IP地址、主机名、协议和端口的请求属性。
                bufferedtrue缓冲输出,使其只定期刷新。

                五、配置实例

                server:
                  tomcat:
                    accesslog:
                      enabled: true
                      pattern: '%{yyyy-MM-dd HH:mm:ss}t %a %A %m %s %D %b %I %U%q %{User-Agent}i'
                      directory: D:\logs\projectName\
                      prefix: accesslog
                      suffix: .log
                      fileDateFormat: _yyyyMMdd
                      rotate: true
                      renameOnRotate: false
                      buffered: true
                      requestAttributesEnabled: true
                

                六、pattern参数组成说明

                pattern属性由一系列的字符串参数组成,每个参数都有前缀"%",目前支持下面这些参数:

                • %a - 远程IP地址
                • %A - 本地IP地址
                • %b - 发送的字节数(Bytes sent), 不包括HTTP headers的字节,如果为0则展示’-’
                • %B - 发送的字节数(Bytes sent), 不包括HTTP headers的字节
                • %h - 远程主机名称(如果resolveHosts为false则展示IP)
                • %H - 请求协议
                • %l - 远程用户名,始终为’-'(Remote logical username from identd)
                • %m - 请求的方法(GET, POST等)
                • %p - 接受请求的本地端口
                • %q - 查询字符串,如果存在,有一个前置的’?’
                • %r - 请求的第一行(包括请求方法和请求的URI)
                • %s - response的HTTP状态码(200,404等)
                • %S - 用户的session ID
                • %t - 日期和时间,Common Log Format格式,使用%{yyyy-MM-dd HH:mm:ss}t控制格式化输出。
                • %u - 被认证的远程用户, 不存在则展示’-’
                • %U - 请求URL路径
                • %v - 本地服务名
                • %D - 处理请求的时间,单位为毫秒
                • %T - 处理请求的时间,单位为秒
                • %I - 当前请求的线程名(can compare later with stacktraces)

                  七、常用的pattern配置

                  7.1 pattern默认值

                  其中pattern参数有两个默认模式common、combined模式,使用方式为:

                  server:
                    tomcat:
                      accesslog:
                        pattern: combined #或common
                  

                  7.2 默认配置说明

                  • common
                    • 默认配置:%h %l %u %t %r %s %b
                    • combined
                      • 默认配置:%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i
                      • 模式的pattern增加Referer和User-Agent headers的参数形式。比如%{User-Agent}i 即请求的User-Agent值(客户端,浏览器)。
                      • 自定义的配置
                        • 常规
                          • %{yyyy-MM-dd HH:mm:ss}t %a %A %m %s %D %b %I %U%q
                          • 请求时间 远端IP 本地IP 方法 状态码 耗时(毫秒) 发送字节数 线程名 请求地址+查询参数
                          • %A本机IP这个选项如果不做集中日志收集,不太需要改值
                          • 常规+ua
                            • %{yyyy-MM-dd HH:mm:ss}t %a %A %m %s %D %b %I %U%q %{User-Agent}i
                            • 请求时间 远端IP 本地IP 方法 状态码 耗时(毫秒) 发送字节数 线程名 请求地址+查询参数 请求UA
                            • %A本机IP这个选项如果不做集中日志收集,不太需要改值
                            • 不写本地IP
                              • %{yyyy-MM-dd HH:mm:ss}t %a %m %s %D %b %I %U%q
                              • 请求时间 远端IP 方法 状态码 耗时(毫秒) 发送字节数 线程名 请求地址+查询参数
                              • 写入useragent
                                • %{yyyy-MM-dd HH:mm:ss}t %a %m %s %D %b %I %U%q %{User-Agent}i
                                • 请求时间 远端IP 本地IP 方法 状态码 耗时(毫秒) 发送字节数 线程名 请求地址+查询参数 请求UA

                                  7.3 打印请求、响应中cookie、header中的内容

                                  Access Log中也支持cookie,请求header,响应headers,Session或者其他在ServletRequest中的对象的信息,下面的xxx为有效的参数名。

                                  如输出User-Agent要写成%{User-Agent}i。

                                  • %{xxx}i 请求头中指定参数的值。
                                  • %{xxx}o 响应头中指定参数的值。
                                  • %{xxx}c cookie中指定参数的值。
                                  • %{xxx}r ServletRequest对象属性值。
                                  • %{xxx}s HttpSession对象属性值。
                                  • %{xxx}p 写本地(服务器)端口(xxx==local)或远程(客户端)端口(xxx=remote)。
                                  • %{xxx}t 控制日期和时间的格式化输出。

                                    八、总结

                                    通过记录access log,可以排查每个请求的一些关键信息。分析出那些地址是常用的请求,那些服务耗时严重,那些时间段的请求量大等信息。

                                    这些信息可以通过日志分析工具去分析,也可以使用awk命令实时统计。