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
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注
  • Undertow
    2 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...