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