diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala index 40907bcf..7824ec8d 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala @@ -17,7 +17,6 @@ package org.typelevel.log4cats import cats.* -import cats.Show.Shown trait SelfAwareStructuredLogger[F[_]] extends SelfAwareLogger[F] with StructuredLogger[F] { override def mapK[G[_]](fk: F ~> G): SelfAwareStructuredLogger[G] = @@ -26,13 +25,6 @@ trait SelfAwareStructuredLogger[F[_]] extends SelfAwareLogger[F] with Structured override def addContext(ctx: Map[String, String]): SelfAwareStructuredLogger[F] = SelfAwareStructuredLogger.withContext(this)(ctx) - override def addContext( - pairs: (String, Shown)* - ): SelfAwareStructuredLogger[F] = - SelfAwareStructuredLogger.withContext(this)( - pairs.map { case (k, v) => (k, v.toString) }.toMap - ) - override def withModifiedString(f: String => String): SelfAwareStructuredLogger[F] = SelfAwareStructuredLogger.withModifiedString[F](this, f) } diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/StructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/StructuredLogger.scala index ee50e011..06cbf72a 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/StructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/StructuredLogger.scala @@ -17,7 +17,9 @@ package org.typelevel.log4cats import cats.* +import cats.syntax.foldable.* import cats.Show.Shown +import cats.Show.ContravariantShow trait StructuredLogger[F[_]] extends Logger[F] { def trace(ctx: Map[String, String])(msg: => String): F[Unit] @@ -36,18 +38,27 @@ trait StructuredLogger[F[_]] extends Logger[F] { def addContext(ctx: Map[String, String]): StructuredLogger[F] = StructuredLogger.withContext(this)(ctx) + def addContext(pair: StructuredLogger.ContextPair): StructuredLogger[F] = + addContext(pair.toMap) + def addContext( - pairs: (String, Shown)* + pairs: StructuredLogger.ContextPair* ): StructuredLogger[F] = - StructuredLogger.withContext(this)( - pairs.map { case (k, v) => (k, v.toString) }.toMap - ) + addContext(pairs.toList.foldMap(_.toMap)) override def withModifiedString(f: String => String): StructuredLogger[F] = StructuredLogger.withModifiedString[F](this, f) } object StructuredLogger { + + final case class ContextPair(value: (String, Shown)) extends AnyVal { + def toMap: Map[String, String] = Map(value._1 -> value._2.toString) + } + + implicit def log4catsTupleToContextPair[A: ContravariantShow](pair: (String, A)): ContextPair = + ContextPair((pair._1, Shown.mat(pair._2))) + def apply[F[_]](implicit ev: StructuredLogger[F]): StructuredLogger[F] = ev def withContext[F[_]](sl: StructuredLogger[F])(ctx: Map[String, String]): StructuredLogger[F] = diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredSelfAwareStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredSelfAwareStructuredLogger.scala index 778305db..31ed0b0d 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredSelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredSelfAwareStructuredLogger.scala @@ -20,7 +20,7 @@ import cats.data.Chain import cats.effect.kernel.Resource.ExitCase import cats.effect.kernel.{Concurrent, Ref, Resource} import cats.syntax.all.* -import cats.{~>, Show} +import cats.~> import org.typelevel.log4cats.SelfAwareStructuredLogger /** @@ -39,11 +39,6 @@ trait DeferredSelfAwareStructuredLogger[F[_]] override def addContext(ctx: Map[String, String]): DeferredSelfAwareStructuredLogger[F] = DeferredSelfAwareStructuredLogger.withContext(this)(ctx) - override def addContext(pairs: (String, Show.Shown)*): DeferredSelfAwareStructuredLogger[F] = - DeferredSelfAwareStructuredLogger.withContext(this)( - pairs.map { case (k, v) => (k, v.toString) }.toMap - ) - override def withModifiedString(f: String => String): DeferredSelfAwareStructuredLogger[F] = DeferredSelfAwareStructuredLogger.withModifiedString(this, f) } diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredStructuredLogger.scala b/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredStructuredLogger.scala index 1c0855bc..832fe783 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/extras/DeferredStructuredLogger.scala @@ -16,7 +16,6 @@ package org.typelevel.log4cats.extras -import cats.Show.Shown import cats.data.Chain import cats.effect.kernel.Resource.ExitCase import cats.effect.kernel.{Concurrent, Ref, Resource} @@ -56,11 +55,6 @@ trait DeferredStructuredLogger[F[_]] extends StructuredLogger[F] with DeferredLo override def addContext(ctx: Map[String, String]): DeferredStructuredLogger[F] = DeferredStructuredLogger.withContext(this, ctx) - override def addContext( - pairs: (String, Shown)* - ): DeferredStructuredLogger[F] = - DeferredStructuredLogger.withContext(this, pairs.map { case (k, v) => (k, v.toString) }.toMap) - override def withModifiedString(f: String => String): DeferredStructuredLogger[F] = DeferredStructuredLogger.withModifiedString[F](this, f) }