object HttpRoutesLogger { import cats.data.{Kleisli, OptionT} import cats.syntax.all.* import org.http4s.internal.Logger as Http4sLogger import org.http4s.{HttpRoutes, Request, Response} import org.typelevel.log4cats.Logger def isResponseError[F[_]](res: Response[F]): Boolean = !res.status.isSuccess private def logError[F[_]: {Concurrent, Logger}](req: Request[F], res: Response[F]): F[Unit] = Http4sLogger.logMessage(req)(true, true)(Logger[F].warn) *> Http4sLogger.logMessage(res)(true, true)(Logger[F].warn) def apply[F[_]: {Concurrent, Logger}]: HttpRoutes[F] => HttpRoutes[F] = http => Kleisli: req => http(req).flatTap: res => OptionT.liftF(logError(req, res)).whenA(isResponseError(res)) }