Skip to content

Commit 587267c

Browse files
committed
Rough draft of an MTL-based logger
1 parent a5916fb commit 587267c

File tree

3 files changed

+80
-1
lines changed

3 files changed

+80
-1
lines changed

build.sbt

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ThisBuild / tlVersionIntroduced := Map("3" -> "2.1.1")
2828

2929
val catsV = "2.11.0"
3030
val catsEffectV = "3.5.7"
31+
val catsMtlV = "1.4.0"
3132
val slf4jV = "1.7.36"
3233
val munitCatsEffectV = "2.0.0"
3334
val logbackClassicV = "1.2.13"
@@ -47,7 +48,8 @@ lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform)
4748
name := "log4cats-core",
4849
libraryDependencies ++= Seq(
4950
"org.typelevel" %%% "cats-core" % catsV,
50-
"org.typelevel" %%% "cats-effect-std" % catsEffectV
51+
"org.typelevel" %%% "cats-effect-std" % catsEffectV,
52+
"org.typelevel" %%% "cats-mtl" % catsMtlV
5153
),
5254
libraryDependencies ++= {
5355
if (tlIsScala3.value) Seq.empty
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.typelevel.log4cats
2+
3+
import cats.Monad
4+
import cats.mtl.Ask
5+
6+
private[log4cats] class AskStructuredLogger[F[_]](logger: StructuredLogger[F])(implicit
7+
F: Monad[F],
8+
ask: Ask[F, Map[String, String]]
9+
) extends StructuredLogger[F] {
10+
11+
override def error(message: => String): F[Unit] =
12+
F.flatMap(ask.ask)(askCtx => logger.error(askCtx)(message))
13+
14+
override def warn(message: => String): F[Unit] =
15+
F.flatMap(ask.ask)(askCtx => logger.warn(askCtx)(message))
16+
17+
override def info(message: => String): F[Unit] =
18+
F.flatMap(ask.ask)(askCtx => logger.info(askCtx)(message))
19+
20+
override def debug(message: => String): F[Unit] =
21+
F.flatMap(ask.ask)(askCtx => logger.debug(askCtx)(message))
22+
23+
override def trace(message: => String): F[Unit] =
24+
F.flatMap(ask.ask)(askCtx => logger.trace(askCtx)(message))
25+
26+
override def error(t: Throwable)(message: => String): F[Unit] =
27+
F.flatMap(ask.ask)(askCtx => logger.error(askCtx, t)(message))
28+
29+
override def warn(t: Throwable)(message: => String): F[Unit] =
30+
F.flatMap(ask.ask)(askCtx => logger.warn(askCtx, t)(message))
31+
32+
override def info(t: Throwable)(message: => String): F[Unit] =
33+
F.flatMap(ask.ask)(askCtx => logger.info(askCtx, t)(message))
34+
35+
override def debug(t: Throwable)(message: => String): F[Unit] =
36+
F.flatMap(ask.ask)(askCtx => logger.debug(askCtx, t)(message))
37+
38+
override def trace(t: Throwable)(message: => String): F[Unit] =
39+
F.flatMap(ask.ask)(askCtx => logger.trace(askCtx, t)(message))
40+
41+
override def trace(ctx: Map[String, String])(msg: => String): F[Unit] =
42+
F.flatMap(ask.ask)(askCtx => logger.trace(askCtx ++ ctx)(msg))
43+
44+
override def trace(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
45+
F.flatMap(ask.ask)(askCtx => logger.trace(askCtx ++ ctx, t)(msg))
46+
47+
override def debug(ctx: Map[String, String])(msg: => String): F[Unit] =
48+
F.flatMap(ask.ask)(askCtx => logger.debug(askCtx ++ ctx)(msg))
49+
50+
override def debug(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
51+
F.flatMap(ask.ask)(askCtx => logger.debug(askCtx ++ ctx, t)(msg))
52+
53+
override def info(ctx: Map[String, String])(msg: => String): F[Unit] =
54+
F.flatMap(ask.ask)(askCtx => logger.info(askCtx ++ ctx)(msg))
55+
56+
override def info(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
57+
F.flatMap(ask.ask)(askCtx => logger.info(askCtx ++ ctx, t)(msg))
58+
59+
override def warn(ctx: Map[String, String])(msg: => String): F[Unit] =
60+
F.flatMap(ask.ask)(askCtx => logger.warn(askCtx ++ ctx)(msg))
61+
62+
override def warn(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
63+
F.flatMap(ask.ask)(askCtx => logger.warn(askCtx ++ ctx, t)(msg))
64+
65+
override def error(ctx: Map[String, String])(msg: => String): F[Unit] =
66+
F.flatMap(ask.ask)(askCtx => logger.error(askCtx ++ ctx)(msg))
67+
68+
override def error(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
69+
F.flatMap(ask.ask)(askCtx => logger.error(askCtx ++ ctx, t)(msg))
70+
71+
}

core/shared/src/main/scala/org/typelevel/log4cats/StructuredLogger.scala

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package org.typelevel.log4cats
1818

1919
import cats.*
2020
import cats.Show.Shown
21+
import cats.mtl.Ask
2122

2223
trait StructuredLogger[F[_]] extends Logger[F] {
2324
def trace(ctx: Map[String, String])(msg: => String): F[Unit]
@@ -58,6 +59,11 @@ object StructuredLogger {
5859
)(modifyCtx: Map[String, String] => Map[String, String]): StructuredLogger[F] =
5960
new ModifiedContextStructuredLogger[F](sl)(modifyCtx)
6061

62+
def withAskContext[F[_]](
63+
sl: StructuredLogger[F]
64+
)(implicit F: Monad[F], ask: Ask[F, Map[String, String]]) =
65+
new AskStructuredLogger[F](sl)
66+
6167
private class ModifiedContextStructuredLogger[F[_]](sl: StructuredLogger[F])(
6268
modify: Map[String, String] => Map[String, String]
6369
) extends StructuredLogger[F] {

0 commit comments

Comments
 (0)