如何为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
相关产品推荐
相关产品推荐

