You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Scala http4s微服务配置类似Tomcat的访问日志?

http4s完全支持类似Tomcat的访问日志需求,原生就提供了对应的中间件能力,不需要额外引入第三方插件。

实现方式

1. 核心依赖原生中间件

http4s 官方自带 AccessLog 中间件(归属于org.http4s.server.middleware包),只需要给你的业务HttpApp套一层中间件,就能自动拦截所有请求、统计处理时长、记录响应状态,全程无侵入。
基础使用示例:

import org.http4s.ember.server.EmberServerBuilder
import org.http4s.server.middleware.AccessLog
import org.http4s.HttpRoutes
import cats.effect.IO
import org.slf4j.LoggerFactory

// 复用你现有logback配置的slf4j日志实例
private val logger = LoggerFactory.getLogger("AccessLog")

// 你的业务路由
val businessRoutes: HttpRoutes[IO] = ???

// 给路由套访问日志中间件
val loggedHttpApp = AccessLog.httpApp(
  httpApp = businessRoutes.orNotFound,
  // 日志输出走slf4j,完全适配你现有的logback.xml配置
  logAction = msg => IO(logger.info(msg))
)

// 服务启动时使用加了日志的HttpApp即可
EmberServerBuilder.default[IO]
  .withHttpApp(loggedHttpApp)
  .build
  .use(_ => IO.never)
  .unsafeRunSync()

2. 自定义日志格式匹配需求

你需要的"GET /v2/users?searchCriteria=name HTTP/1.1" 200 2333格式可以通过自定义格式化函数实现,所有需要的字段都可以从请求、响应对象以及中间件自带的统计参数中直接获取:

  • 请求方法:request.method
  • 完整请求URI(带查询参数):request.uri
  • HTTP版本:request.httpVersion
  • 响应状态码:response.status.code
  • 处理时长(毫秒):中间件自带请求全链路耗时统计参数

自定义格式示例代码:

val customFormat: AccessLog[IO] = AccessLog.create { (req, resp, duration) =>
  IO.pure(s""""${req.method} ${req.uri} ${req.httpVersion}" ${resp.status.code} ${duration.toMillis}""")
}

val loggedHttpApp = customFormat(services.orNotFound, msg => IO(logger.info(msg)))

3. logback配置适配

访问日志的输出完全走你现有logback配置,你可以单独为访问日志配置独立的FileAppender、滚动策略,和业务日志做隔离,和Tomcat访问日志的配置逻辑完全一致。

注意事项

  • 默认配置仅记录请求元信息,不会打印请求/响应体,性能损耗极低,适合生产环境使用
  • 如果需要排查问题要记录请求体,可以手动开启RequestLogger的logRequestBody参数即可

内容的提问来源于stack exchange,提问作者Stackdeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:36:07