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配置默认值及说明

属性

默认值

说明

enabled

false

开启访问日志。

pattern

“common”

访问日志的格式模式。

directory

“logs”

创建日志文件的目录。可以是相对于tomcat基本目录或绝对目录。

prefix

“access_log”

日志文件名前缀。

suffix

“.log”

日志文件名后缀。

rotate

true

默认为true。这个参数决定是否需要切换切换日志文件,如果被设置为false,则日志文件不会切换,即所有文件打到同一个日志文件中,并且fileDateFormat参数也会被忽略。小心使用这个参数。

renameOnRotate

false

是否推迟将日期戳包含在文件名中,为true的情况下当天的日志文件是没有日期后缀的(如:access_log.txt),每天日期切换时,当天文件重命名为前一天日期后缀,同时新生成当天文件。

fileDateFormat

“.yyyy-MM-dd”

日志文件名称中的日期格式,默认为.yyyy-MM-dd。

requestAttributesEnabled

false

为请求设置IP地址、主机名、协议和端口的请求属性。

buffered

true

缓冲输出,使其只定期刷新。

五、配置实例

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命令实时统计。