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