SpringBoot配置accesslog(内置undertow容器)

背景

公司接口请求经过多层代理,有时总请求时间超长,但nginx中的request_time和应用监控的超时时间对不上,为了明确应用服务的http接口访问时间,需要开启springboot的accesslog。

第一步:首先因为springboot内置了很多web容器,如tomcat jetty undertow,如果选择使用undertow则需要添加undertow容器对应依赖,且排除tomcat相关依赖。

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-undertow</artifactId>
		</dependency>

//....其他依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
				<exclusion>
					<groupId>ch.qos.logback</groupId>
					<artifactId>logback-classic</artifactId>
				</exclusion>
				<exclusion>
					<artifactId>log4j-to-slf4j</artifactId>
					<groupId>org.apache.logging.log4j</groupId>
				</exclusion>
			</exclusions>
		</dependency>

第二步:开启accesslog配置

在springboot 配置文件application.properties中添加如下配置项

# Undertow access log directory. accesslog的目录
#server.undertow.accesslog.dir=weblog 
# Enable access log. 开启accesslog
server.undertow.accesslog.enabled=true 
# Format pattern for access logs.  默认是common,如果不配置pattern
server.undertow.accesslog.pattern=%t [%I] %{i,x_forwarded_for} %a %r %s (%D ms)
# Log file name prefix.  accesslog文件前缀
server.undertow.accesslog.prefix=access_log. 

如果不配置日志的输出格式,也就是不指定server.undertow.accesslog.pattern时,默认使用的是common格式输出,但common格式输出的日志格式是怎样的呢?

查看undertow accesslog处理的源码:io.undertow.server.handlers.accesslog.AccessLogHandler
查看源码可发现日志格式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;
}

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

注意,common格式的日志输出并没有响应时间的输出,如果想输出响应时间,需要用%D

但如果要记录http请求所费时间,需要开启一项server配置,有少量性能影响,所以配置的默认值是false。

开启undertow计时配置则需要在项目增加一项初始化配置类,开启undertow计时。(否则%D无法显示)

@Configuration
public class UndertowConfig {
 
    @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;
    }
}

其他参数定义请参考官网文档:Predicates Attributes and Handlers

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Springboot使用内置tomcat作为默认的web容器,无需额外安装Tomcat,只需在服务部署时直接启动jar包即可。这是因为在spring-boot-starter-web中,默认导入的是tomcat,所以启动时使用的web容器就是tomcat。如果你想配置使用其他的web容器,比如Undertow,可以按照以下步骤进行操作: 1. 修改pom.xml文件,排除默认引入的spring-boot-starter-tomcat依赖,并添加Undertow依赖: ```xml <dependencies> <!-- 导入web场景启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除tomcat starter --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入undertow --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> </dependencies> ``` 通过这样的配置,你就可以使用Undertow作为springboot内置web容器了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot如何使用内嵌Tomcat](https://blog.csdn.net/u011523825/article/details/126114624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot内置Tomcat的配置和切换](https://blog.csdn.net/weixin_39158966/article/details/129745702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值