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

本贴最后更新于 511 天前,其中的信息可能已经时异事殊

场景: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 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖
  • Undertow
    2 引用

相关帖子

欢迎来到这里!

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

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