浩哥笔记

我们的征途是星辰大海

  menu
40 文章
3364 浏览
1 当前访客
ღゝ◡╹)ノ❤️

SpringBoot中使用undertow的accesslog 配置%D 获取耗时不生效问题【最优解】 置顶!

场景:SpringBoot项目中使用了undertow作为web服务,在配置accesslog后发现%D 并不能获取访问耗时

刚开始的配置

server:
  undertow:
    url-charset: UTF-8
    accesslog:
      enabled: true
      dir: /opt/logs
      file-date-format: .yyyy-MM-dd
      prefix: access
      suffix: .log
      pattern: '%t %a %v %r %s %b "%{i,Referer}" "%{i,User-Agent}" "%{i,X-Forwarded-For}" %D ms'
      rotate: true

通过查看文档发现如果需要获取耗时,undertow需要开启 server option的RECORD_REQUEST_START_TIME

网上普遍的解决方案:

就是在自动配置类里新建一个Bean,将属性set进去,代码如下:

@Configuration
public class UndertowConfig {
    /**
     * 开启undertow计时
     * @return
     */
    @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;
    }
}

但这种方法总感觉很奇怪,还要重新new一个新的UndertowServletWebServerFactory, 所以我就没有采取这种做法。
感觉这种开关应该是可以通配置来解决的,通过查看源码发现确实是可以的。

通过配置开启【最优解】

通过配置文件开启undertow的计时:

server:
  undertow:
    url-charset: UTF-8
    options:
      server:
        record-request-start-time: true #记录请求开始时间
    accesslog:
      enabled: true
      dir: /opt/logs
      file-date-format: .yyyy-MM-dd
      prefix: access
      suffix: .log
      pattern: '%t %a %v %r %s %b "%{i,Referer}" "%{i,User-Agent}" "%{i,X-Forwarded-For}" %D ms'
      rotate: true

标题:SpringBoot中使用undertow的accesslog 配置%D 获取耗时不生效问题【最优解】
作者:barryzpc
地址:https://myblog.zhengpc.com/articles/2023/11/22/1700621273810.html
说明:转载请注明出处
赞赏:如果对你有帮助,可略微支持一下
赞赏码