From 87093923d95c1d4e391796b7d91a4f0206930bfa Mon Sep 17 00:00:00 2001 From: Elias Court Date: Wed, 17 Aug 2022 13:38:52 +0100 Subject: [PATCH 01/22] Add helpers for logging with some propagated ctx and kleisli implementation --- .../typelevel/log4cats/LoggerFactory.scala | 20 ++++- .../log4cats/SelfAwareStructuredLogger.scala | 86 +++++++++++++++++++ 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala index 7f5674e7..361a6774 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala @@ -16,9 +16,9 @@ package org.typelevel.log4cats -import cats.Functor +import cats.{~>, FlatMap, Functor, Monad} +import cats.data.Kleisli import cats.syntax.functor._ -import cats.~> import scala.annotation.implicitNotFound @@ -48,4 +48,20 @@ object LoggerFactory extends LoggerFactoryGenCompanion { fk(logger) } } + + def withContextF[F[_]: FlatMap]( + lf: LoggerFactory[F] + )(ctx: F[Map[String, String]]): LoggerFactory[F] = + new LoggerFactory[F] { + override def getLoggerFromName(name: String): SelfAwareStructuredLogger[F] = + SelfAwareStructuredLogger.withContextF(lf.getLoggerFromName(name))(ctx) + + override def fromName(name: String): F[SelfAwareStructuredLogger[F]] = lf + .fromName(name) + .map(SelfAwareStructuredLogger.withContextF(_)(ctx)) + } + + def withContextFromKleisli[F[_]: Monad]( + lf: LoggerFactory[Kleisli[F, Map[String, String], *]] + ): LoggerFactory[Kleisli[F, Map[String, String], *]] = withContextF(lf)(Kleisli.ask) } 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 f143960a..e8966864 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/SelfAwareStructuredLogger.scala @@ -18,6 +18,8 @@ package org.typelevel.log4cats import cats._ import cats.Show.Shown +import cats.data.Kleisli +import cats.implicits.{toFlatMapOps, toFunctorOps} trait SelfAwareStructuredLogger[F[_]] extends SelfAwareLogger[F] with StructuredLogger[F] { override def mapK[G[_]](fk: F ~> G): SelfAwareStructuredLogger[G] = @@ -94,6 +96,90 @@ object SelfAwareStructuredLogger { sl.trace(modify(ctx), t)(message) } + def withContextFromKleisli[F[_]: Monad]( + sl: SelfAwareStructuredLogger[Kleisli[F, Map[String, String], *]] + ): SelfAwareStructuredLogger[Kleisli[F, Map[String, String], *]] = + withContextF(sl)( + Kleisli.ask[F, Map[String, String]] + ) + def withContextF[F[_]: FlatMap]( + sl: SelfAwareStructuredLogger[F] + )(ctx: F[Map[String, String]]): SelfAwareStructuredLogger[F] = + new ModifiedContextFSelfAwareStructuredLogger[F](sl)(existingCtx => ctx.map(_ ++ existingCtx)) + + private class ModifiedContextFSelfAwareStructuredLogger[F[_]: FlatMap]( + sl: SelfAwareStructuredLogger[F] + )( + modify: Map[String, String] => F[Map[String, String]] + ) extends SelfAwareStructuredLogger[F] { + private lazy val defaultCtx: F[Map[String, String]] = modify(Map.empty) + + def error(message: => String): F[Unit] = defaultCtx.flatMap(sl.error(_)(message)) + + def warn(message: => String): F[Unit] = defaultCtx.flatMap(sl.warn(_)(message)) + + def info(message: => String): F[Unit] = defaultCtx.flatMap(sl.info(_)(message)) + + def debug(message: => String): F[Unit] = defaultCtx.flatMap(sl.debug(_)(message)) + + def trace(message: => String): F[Unit] = defaultCtx.flatMap(sl.trace(_)(message)) + + def trace(ctx: Map[String, String])(msg: => String): F[Unit] = + modify(ctx).flatMap(sl.trace(_)(msg)) + + def debug(ctx: Map[String, String])(msg: => String): F[Unit] = + modify(ctx).flatMap(sl.debug(_)(msg)) + + def info(ctx: Map[String, String])(msg: => String): F[Unit] = + modify(ctx).flatMap(sl.info(_)(msg)) + + def warn(ctx: Map[String, String])(msg: => String): F[Unit] = + modify(ctx).flatMap(sl.warn(_)(msg)) + + def error(ctx: Map[String, String])(msg: => String): F[Unit] = + modify(ctx).flatMap(sl.error(_)(msg)) + + def isTraceEnabled: F[Boolean] = sl.isTraceEnabled + + def isDebugEnabled: F[Boolean] = sl.isDebugEnabled + + def isInfoEnabled: F[Boolean] = sl.isInfoEnabled + + def isWarnEnabled: F[Boolean] = sl.isWarnEnabled + + def isErrorEnabled: F[Boolean] = sl.isErrorEnabled + + def error(t: Throwable)(message: => String): F[Unit] = + defaultCtx.flatMap(sl.error(_, t)(message)) + + def warn(t: Throwable)(message: => String): F[Unit] = + defaultCtx.flatMap(sl.warn(_, t)(message)) + + def info(t: Throwable)(message: => String): F[Unit] = + defaultCtx.flatMap(sl.info(_, t)(message)) + + def debug(t: Throwable)(message: => String): F[Unit] = + defaultCtx.flatMap(sl.debug(_, t)(message)) + + def trace(t: Throwable)(message: => String): F[Unit] = + defaultCtx.flatMap(sl.trace(_, t)(message)) + + def error(ctx: Map[String, String], t: Throwable)(message: => String): F[Unit] = + modify(ctx).flatMap(sl.error(_, t)(message)) + + def warn(ctx: Map[String, String], t: Throwable)(message: => String): F[Unit] = + modify(ctx).flatMap(sl.warn(_, t)(message)) + + def info(ctx: Map[String, String], t: Throwable)(message: => String): F[Unit] = + modify(ctx).flatMap(sl.info(_, t)(message)) + + def debug(ctx: Map[String, String], t: Throwable)(message: => String): F[Unit] = + modify(ctx).flatMap(sl.debug(_, t)(message)) + + def trace(ctx: Map[String, String], t: Throwable)(message: => String): F[Unit] = + modify(ctx).flatMap(sl.trace(_, t)(message)) + } + private def withModifiedString[F[_]]( l: SelfAwareStructuredLogger[F], f: String => String From d8f116438344ae16e18e315a6baccd44703d5f2b Mon Sep 17 00:00:00 2001 From: Elias Court Date: Wed, 17 Aug 2022 13:47:24 +0100 Subject: [PATCH 02/22] Add ce3 module and iolocal instances --- build.sbt | 10 ++++++++++ .../typelevel/log4cats/ce3/IOLocalHelpers.scala | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala diff --git a/build.sbt b/build.sbt index 754d93f0..85b809d5 100644 --- a/build.sbt +++ b/build.sbt @@ -76,6 +76,16 @@ lazy val noop = crossProject(JSPlatform, JVMPlatform, NativePlatform) ) .nativeSettings(commonNativeSettings) +lazy val ce3 = crossProject(JSPlatform, JVMPlatform) + .settings(commonSettings) + .dependsOn(core) + .settings( + name := "log4cats-ce3", + libraryDependencies ++= Seq( + "org.typelevel" %%% "cats-effect" % catsEffectV + ) + ) + lazy val slf4j = project .settings(commonSettings) .dependsOn(core.jvm) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala new file mode 100644 index 00000000..c7a7b642 --- /dev/null +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -0,0 +1,16 @@ +package org.typelevel.log4cats.ce3 + +import cats.effect.{IO, IOLocal} +import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} + +object IOLocalHelpers { + def loggerWithContextFromIOLocal( + sl: SelfAwareStructuredLogger[IO], + local: IOLocal[Map[String, String]] + ): SelfAwareStructuredLogger[IO] = SelfAwareStructuredLogger.withContextF(sl)(local.get) + + def factoryWithContextFromIOLocal( + lf: LoggerFactory[IO], + local: IOLocal[Map[String, String]] + ): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.get) +} From f0629f3c3d74d5bff33417e941d0fc0ac88c10d3 Mon Sep 17 00:00:00 2001 From: "Ross A. Baker" Date: Sun, 19 Feb 2023 21:44:47 -0500 Subject: [PATCH 03/22] Regenerate workflow after merge --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08fe9a3f..e9611a67 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -119,11 +119,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target + run: mkdir -p testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target ce3/jvm/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target project/target + run: tar cf targets.tar testing/jvm/target noop/jvm/target target .js/target core/native/target site/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target .jvm/target .native/target slf4j/target ce3/jvm/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') From a0b1449ac4f9cd9c1de6a83183d71dd9a92141b2 Mon Sep 17 00:00:00 2001 From: Jay Lokhande <91283261+Jay-Lokhande@users.noreply.github.com> Date: Thu, 27 Mar 2025 08:34:39 +0530 Subject: [PATCH 04/22] added Cats Effect 3.6.0 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ad51566c..d31ef20a 100644 --- a/build.sbt +++ b/build.sbt @@ -27,7 +27,7 @@ ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8"), JavaSpec.te ThisBuild / tlVersionIntroduced := Map("3" -> "2.1.1") val catsV = "2.9.0" -val catsEffectV = "3.4.7" +val catsEffectV = "3.6.0" val slf4jV = "1.7.36" val munitCatsEffectV = "2.0.0-M3" val logbackClassicV = "1.2.11" From 55b7fb232384fefd573e57b9d5fd48b2c1219869 Mon Sep 17 00:00:00 2001 From: Jay Lokhande <91283261+Jay-Lokhande@users.noreply.github.com> Date: Thu, 27 Mar 2025 08:45:22 +0530 Subject: [PATCH 05/22] added name "log4cats-cats-effect" --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d31ef20a..163c46ee 100644 --- a/build.sbt +++ b/build.sbt @@ -80,7 +80,7 @@ lazy val ce3 = crossProject(JSPlatform, JVMPlatform) .settings(commonSettings) .dependsOn(core) .settings( - name := "log4cats-ce3", + name := "log4cats-cats-effect", libraryDependencies ++= Seq( "org.typelevel" %%% "cats-effect" % catsEffectV ) From 036981bcd3aa8713deb9a2761db210ab475c5fef Mon Sep 17 00:00:00 2001 From: Jay Lokhande <91283261+Jay-Lokhande@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:12:24 +0530 Subject: [PATCH 06/22] Update IOLocalHelpers.scala --- .../log4cats/ce3/IOLocalHelpers.scala | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala index c7a7b642..a65153a2 100644 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -1,4 +1,4 @@ -package org.typelevel.log4cats.ce3 +/*package org.typelevel.log4cats.ce3 import cats.effect.{IO, IOLocal} import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} @@ -13,4 +13,31 @@ object IOLocalHelpers { lf: LoggerFactory[IO], local: IOLocal[Map[String, String]] ): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.get) +}*/ +import cats.effect.{IO, IOLocal, Local} +import org.typelevel.log4cats.SelfAwareStructuredLogger + +object IOLocalHelpers { + def loggerWithContextFromIOLocal(ioLocal: IOLocal[Map[String, String]]): SelfAwareStructuredLogger[IO] = { + new SelfAwareStructuredLogger[IO] { + override def trace(ctx: Map[String, String])(msg: => String): IO[Unit] = + logWithContext(msg, _ => ctx) + override def debug(ctx: Map[String, String])(msg: => String): IO[Unit] = + logWithContext(msg, _ => ctx) + override def info(ctx: Map[String, String])(msg: => String): IO[Unit] = + logWithContext(msg, _ => ctx) + override def warn(ctx: Map[String, String])(msg: => String): IO[Unit] = + logWithContext(msg, _ => ctx) + override def error(ctx: Map[String, String])(msg: => String): IO[Unit] = + logWithContext(msg, _ => ctx) + + private def logWithContext(msg: String, contextMod: Map[String, String] => Map[String, String]) + (implicit local: Local[IO, Map[String, String]]): IO[Unit] = { + local.ask.flatMap { currentContext => + val newContext = contextMod(currentContext) + local.local(IO(println(s"[$newContext] $msg")))(newContext) + } + } + } + } } From 447bdf5928399718eccba0de7c15b96d8178bf08 Mon Sep 17 00:00:00 2001 From: Jay Lokhande <91283261+Jay-Lokhande@users.noreply.github.com> Date: Thu, 27 Mar 2025 15:27:19 +0530 Subject: [PATCH 07/22] Update IOLocalHelpers.scala --- .../log4cats/ce3/IOLocalHelpers.scala | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala index a65153a2..c7a7b642 100644 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -1,4 +1,4 @@ -/*package org.typelevel.log4cats.ce3 +package org.typelevel.log4cats.ce3 import cats.effect.{IO, IOLocal} import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} @@ -13,31 +13,4 @@ object IOLocalHelpers { lf: LoggerFactory[IO], local: IOLocal[Map[String, String]] ): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.get) -}*/ -import cats.effect.{IO, IOLocal, Local} -import org.typelevel.log4cats.SelfAwareStructuredLogger - -object IOLocalHelpers { - def loggerWithContextFromIOLocal(ioLocal: IOLocal[Map[String, String]]): SelfAwareStructuredLogger[IO] = { - new SelfAwareStructuredLogger[IO] { - override def trace(ctx: Map[String, String])(msg: => String): IO[Unit] = - logWithContext(msg, _ => ctx) - override def debug(ctx: Map[String, String])(msg: => String): IO[Unit] = - logWithContext(msg, _ => ctx) - override def info(ctx: Map[String, String])(msg: => String): IO[Unit] = - logWithContext(msg, _ => ctx) - override def warn(ctx: Map[String, String])(msg: => String): IO[Unit] = - logWithContext(msg, _ => ctx) - override def error(ctx: Map[String, String])(msg: => String): IO[Unit] = - logWithContext(msg, _ => ctx) - - private def logWithContext(msg: String, contextMod: Map[String, String] => Map[String, String]) - (implicit local: Local[IO, Map[String, String]]): IO[Unit] = { - local.ask.flatMap { currentContext => - val newContext = contextMod(currentContext) - local.local(IO(println(s"[$newContext] $msg")))(newContext) - } - } - } - } } From 9e42efd925a7a6429182932f84a6fed8b2a69e49 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:03:46 +0530 Subject: [PATCH 08/22] added cats.mtl.Local usage --- .../typelevel/log4cats/ce3/IOLocalHelpers.scala | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala index c7a7b642..c6b55f01 100644 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -1,16 +1,17 @@ package org.typelevel.log4cats.ce3 -import cats.effect.{IO, IOLocal} +import cats.effect.IO +import cats.mtl.Local import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} object IOLocalHelpers { def loggerWithContextFromIOLocal( - sl: SelfAwareStructuredLogger[IO], - local: IOLocal[Map[String, String]] - ): SelfAwareStructuredLogger[IO] = SelfAwareStructuredLogger.withContextF(sl)(local.get) + sl: SelfAwareStructuredLogger[IO] + )(implicit local: Local[IO, Map[String, String]]): SelfAwareStructuredLogger[IO] = + SelfAwareStructuredLogger.withContextF(sl)(local.ask) def factoryWithContextFromIOLocal( - lf: LoggerFactory[IO], - local: IOLocal[Map[String, String]] - ): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.get) + lf: LoggerFactory[IO] + )(implicit local: Local[IO, Map[String, String]]): LoggerFactory[IO] = + LoggerFactory.withContextF(lf)(local.ask) } From 5a42ec4a9ed9a9f5eabbec303af6a7eb8c01d29b Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:12:10 +0530 Subject: [PATCH 09/22] Update ci.yml --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df64a8d2..9ce5ea61 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,11 +105,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p testing/jvm/target noop/jvm/target core/native/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target project/target + run: mkdir -p testing/jvm/target noop/jvm/target core/native/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target ce3/jvm/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar testing/jvm/target noop/jvm/target core/native/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target project/target + run: tar cf targets.tar testing/jvm/target noop/jvm/target core/native/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target ce3/jvm/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') From c2a5a948bc2a1d711e9ad7e7ea65153cb3de385a Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:15:50 +0530 Subject: [PATCH 10/22] Removed unused import --- .../src/main/scala/org/typelevel/log4cats/LoggerFactory.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala index e8784800..768d1908 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala @@ -23,7 +23,6 @@ import cats.data.EitherT import cats.data.Kleisli import cats.data.OptionT import cats.Show.Shown -import cats.data.Kleisli import cats.syntax.functor.* import cats.~> From 619871896f43e3c3e81729561cc2b816fd6e7cad Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:26:52 +0530 Subject: [PATCH 11/22] applied sbt scalafmt --- .../typelevel/log4cats/LoggerFactory.scala | 2 - .../log4cats/extras/LogMessage.scala | 43 ------------------- 2 files changed, 45 deletions(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala index 768d1908..ba6ddac3 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala @@ -112,6 +112,4 @@ object LoggerFactory extends LoggerFactoryGenCompanion { override def fromName(name: String): F[SelfAwareStructuredLogger[F]] = lf.fromName(name).map(_.withModifiedString(f)) } - - } diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala index 176c0848..8b137891 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala @@ -1,44 +1 @@ -/* - * Copyright 2018 Typelevel - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.typelevel.log4cats.extras - -import cats.* -import cats.syntax.all.* -import org.typelevel.log4cats.Logger - -final case class LogMessage(level: LogLevel, t: Option[Throwable], message: String) -object LogMessage { - implicit val logMessageShow: Show[LogMessage] = - Show.show[LogMessage](l => show"LogMessage(${l.level},${l.t.map(_.getMessage)},${l.message})") - - def log[F[_]](sm: LogMessage, l: Logger[F]): F[Unit] = sm match { - case LogMessage(LogLevel.Trace, Some(t), m) => l.trace(t)(m) - case LogMessage(LogLevel.Trace, None, m) => l.trace(m) - - case LogMessage(LogLevel.Debug, Some(t), m) => l.debug(t)(m) - case LogMessage(LogLevel.Debug, None, m) => l.debug(m) - - case LogMessage(LogLevel.Info, Some(t), m) => l.info(t)(m) - case LogMessage(LogLevel.Info, None, m) => l.info(m) - - case LogMessage(LogLevel.Warn, Some(t), m) => l.warn(t)(m) - case LogMessage(LogLevel.Warn, None, m) => l.warn(m) - - case LogMessage(LogLevel.Error, Some(t), m) => l.error(t)(m) - case LogMessage(LogLevel.Error, None, m) => l.error(m) - } -} From d66f965d0e03e66fe498c25939bc082c248ba37a Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:31:44 +0530 Subject: [PATCH 12/22] reconfigured sbt scalafmt extra removal --- .../log4cats/extras/LogMessage.scala | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala index 8b137891..affc94b8 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala @@ -1 +1,44 @@ +/* + * Copyright 2018 Typelevel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.typelevel.log4cats.extras + +import cats.* +import cats.syntax.all.* +import org.typelevel.log4cats.Logger + +final case class LogMessage(level: LogLevel, t: Option[Throwable], message: String) +object LogMessage { + implicit val logMessageShow: Show[LogMessage] = + Show.show[LogMessage](l => show"LogMessage(${l.level},${l.t.map(_.getMessage)},${l.message})") + + def log[F[_]](sm: LogMessage, l: Logger[F]): F[Unit] = sm match { + case LogMessage(LogLevel.Trace, Some(t), m) => l.trace(t)(m) + case LogMessage(LogLevel.Trace, None, m) => l.trace(m) + + case LogMessage(LogLevel.Debug, Some(t), m) => l.debug(t)(m) + case LogMessage(LogLevel.Debug, None, m) => l.debug(m) + + case LogMessage(LogLevel.Info, Some(t), m) => l.info(t)(m) + case LogMessage(LogLevel.Info, None, m) => l.info(m) + + case LogMessage(LogLevel.Warn, Some(t), m) => l.warn(t)(m) + case LogMessage(LogLevel.Warn, None, m) => l.warn(m) + + case LogMessage(LogLevel.Error, Some(t), m) => l.error(t)(m) + case LogMessage(LogLevel.Error, None, m) => l.error(m) + } +} \ No newline at end of file From 63fabf826e5fd367dfb81b381412f74fffeabdd9 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 08:34:47 +0530 Subject: [PATCH 13/22] sbt scalafmt on LogMessage.scala --- .../main/scala/org/typelevel/log4cats/extras/LogMessage.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala index affc94b8..176c0848 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/extras/LogMessage.scala @@ -41,4 +41,4 @@ object LogMessage { case LogMessage(LogLevel.Error, Some(t), m) => l.error(t)(m) case LogMessage(LogLevel.Error, None, m) => l.error(m) } -} \ No newline at end of file +} From 72e1dc9de7a641d7eaf2df82509aa7d12be2094f Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 09:56:58 +0530 Subject: [PATCH 14/22] Update IOLocalHelpers with format --- .../scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala index c6b55f01..449f5454 100644 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -6,12 +6,12 @@ import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} object IOLocalHelpers { def loggerWithContextFromIOLocal( - sl: SelfAwareStructuredLogger[IO] - )(implicit local: Local[IO, Map[String, String]]): SelfAwareStructuredLogger[IO] = + sl: SelfAwareStructuredLogger[IO] + )(implicit local: Local[IO, Map[String, String]]): SelfAwareStructuredLogger[IO] = SelfAwareStructuredLogger.withContextF(sl)(local.ask) def factoryWithContextFromIOLocal( - lf: LoggerFactory[IO] - )(implicit local: Local[IO, Map[String, String]]): LoggerFactory[IO] = + lf: LoggerFactory[IO] + )(implicit local: Local[IO, Map[String, String]]): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.ask) } From 1ce07a526f863b9408e2626916b1f81e791621b9 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Fri, 28 Mar 2025 10:16:58 +0530 Subject: [PATCH 15/22] Update IOLocalHelpers with naming --- .../scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala index 449f5454..53abcbb7 100644 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala @@ -5,13 +5,13 @@ import cats.mtl.Local import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} object IOLocalHelpers { - def loggerWithContextFromIOLocal( + def loggerWithContext( sl: SelfAwareStructuredLogger[IO] )(implicit local: Local[IO, Map[String, String]]): SelfAwareStructuredLogger[IO] = SelfAwareStructuredLogger.withContextF(sl)(local.ask) - def factoryWithContextFromIOLocal( + def factoryWithContext( lf: LoggerFactory[IO] )(implicit local: Local[IO, Map[String, String]]): LoggerFactory[IO] = LoggerFactory.withContextF(lf)(local.ask) -} +} \ No newline at end of file From 5a2e24faa0c5475e8529169df542ed9e10dad875 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Mon, 7 Apr 2025 23:44:13 +0530 Subject: [PATCH 16/22] Add cats-mtl dependency to core for LocalHelpers --- build.sbt | 4 +++- .../log4cats/ce3/IOLocalHelpers.scala | 17 ----------------- .../org/typelevel/log4cats/LocalHelpers.scala | 18 ++++++++++++++++++ 3 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala create mode 100644 core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala diff --git a/build.sbt b/build.sbt index 07fcde2b..ff7fe9b5 100644 --- a/build.sbt +++ b/build.sbt @@ -31,6 +31,7 @@ val catsEffectV = "3.6.0" val slf4jV = "1.7.36" val munitCatsEffectV = "2.0.0" val logbackClassicV = "1.2.13" +val catsMtlV = "1.4.0" Global / onChangedBuildSource := ReloadOnSourceChanges @@ -47,7 +48,8 @@ lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform) name := "log4cats-core", libraryDependencies ++= Seq( "org.typelevel" %%% "cats-core" % catsV, - "org.typelevel" %%% "cats-effect-std" % catsEffectV + "org.typelevel" %%% "cats-effect-std" % catsEffectV, + "org.typelevel" %%% "cats-mtl" % catsMtlV ), libraryDependencies ++= { if (tlIsScala3.value) Seq.empty diff --git a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala b/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala deleted file mode 100644 index 53abcbb7..00000000 --- a/ce3/shared/src/main/scala/org/typelevel/log4cats/ce3/IOLocalHelpers.scala +++ /dev/null @@ -1,17 +0,0 @@ -package org.typelevel.log4cats.ce3 - -import cats.effect.IO -import cats.mtl.Local -import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} - -object IOLocalHelpers { - def loggerWithContext( - sl: SelfAwareStructuredLogger[IO] - )(implicit local: Local[IO, Map[String, String]]): SelfAwareStructuredLogger[IO] = - SelfAwareStructuredLogger.withContextF(sl)(local.ask) - - def factoryWithContext( - lf: LoggerFactory[IO] - )(implicit local: Local[IO, Map[String, String]]): LoggerFactory[IO] = - LoggerFactory.withContextF(lf)(local.ask) -} \ No newline at end of file diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala new file mode 100644 index 00000000..f7e00bbb --- /dev/null +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala @@ -0,0 +1,18 @@ +package org.typelevel.log4cats + +import cats.mtl.Local +import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} + +object LocalHelpers { + implicit class LoggerOps[F[_]](sl: SelfAwareStructuredLogger[F]) { + def withLocalContext(implicit + local: Local[F, Map[String, String]] + ): SelfAwareStructuredLogger[F] = + SelfAwareStructuredLogger.withContextF(sl)(local.ask) + } + + implicit class FactoryOps[F[_]](lf: LoggerFactory[F]) { + def withLocalContext(implicit local: Local[F, Map[String, String]]): LoggerFactory[F] = + LoggerFactory.withContextF(lf)(local.ask) + } +} From 1981df74627174ca97d695cff0d65584a0a6f1ea Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Mon, 7 Apr 2025 23:48:26 +0530 Subject: [PATCH 17/22] Added header to the file --- .../org/typelevel/log4cats/LocalHelpers.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala index f7e00bbb..5a9e2050 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala @@ -1,3 +1,19 @@ +/* + * Copyright 2018 Typelevel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.typelevel.log4cats import cats.mtl.Local From 2aeeb378a4e804e916d0b69105d12c4fa1efdcfc Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Mon, 7 Apr 2025 23:56:34 +0530 Subject: [PATCH 18/22] Add FlatMap[F] constraint to LocalHelpers for withContextF compatibility --- build.sbt | 2 +- .../org/typelevel/log4cats/LocalHelpers.scala | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index ff7fe9b5..50e29b5c 100644 --- a/build.sbt +++ b/build.sbt @@ -49,7 +49,7 @@ lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform) libraryDependencies ++= Seq( "org.typelevel" %%% "cats-core" % catsV, "org.typelevel" %%% "cats-effect-std" % catsEffectV, - "org.typelevel" %%% "cats-mtl" % catsMtlV + "org.typelevel" %%% "cats-mtl" % catsMtlV ), libraryDependencies ++= { if (tlIsScala3.value) Seq.empty diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala index 5a9e2050..eb7330c3 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala @@ -19,16 +19,26 @@ package org.typelevel.log4cats import cats.mtl.Local import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} +package org.typelevel.log4cats + +import cats.FlatMap +import cats.mtl.Local +import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} + object LocalHelpers { implicit class LoggerOps[F[_]](sl: SelfAwareStructuredLogger[F]) { def withLocalContext(implicit - local: Local[F, Map[String, String]] + local: Local[F, Map[String, String]], + F: FlatMap[F] ): SelfAwareStructuredLogger[F] = SelfAwareStructuredLogger.withContextF(sl)(local.ask) } implicit class FactoryOps[F[_]](lf: LoggerFactory[F]) { - def withLocalContext(implicit local: Local[F, Map[String, String]]): LoggerFactory[F] = + def withLocalContext(implicit + local: Local[F, Map[String, String]], + F: FlatMap[F] + ): LoggerFactory[F] = LoggerFactory.withContextF(lf)(local.ask) } } From 9054d8752092db905882d5954df906be34e654d9 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Tue, 8 Apr 2025 00:00:08 +0530 Subject: [PATCH 19/22] removed same package installation multiple times --- .../src/main/scala/org/typelevel/log4cats/LocalHelpers.scala | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala index eb7330c3..54cf392d 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala @@ -16,11 +16,6 @@ package org.typelevel.log4cats -import cats.mtl.Local -import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} - -package org.typelevel.log4cats - import cats.FlatMap import cats.mtl.Local import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} From 489d29ecbd632e3147518fa9a2eea6c6c747a558 Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Tue, 8 Apr 2025 00:20:15 +0530 Subject: [PATCH 20/22] handled imports --- .../src/main/scala/org/typelevel/log4cats/LocalHelpers.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala index 54cf392d..3cda5cc8 100644 --- a/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala +++ b/core/shared/src/main/scala/org/typelevel/log4cats/LocalHelpers.scala @@ -18,7 +18,6 @@ package org.typelevel.log4cats import cats.FlatMap import cats.mtl.Local -import org.typelevel.log4cats.{LoggerFactory, SelfAwareStructuredLogger} object LocalHelpers { implicit class LoggerOps[F[_]](sl: SelfAwareStructuredLogger[F]) { From d752b40985406f32fbd2ca21e592aaefa6924c4d Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Tue, 8 Apr 2025 21:35:03 +0530 Subject: [PATCH 21/22] updated build.sbt --- build.sbt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/build.sbt b/build.sbt index 50e29b5c..12982844 100644 --- a/build.sbt +++ b/build.sbt @@ -87,16 +87,6 @@ lazy val noop = crossProject(JSPlatform, JVMPlatform, NativePlatform) ) .nativeSettings(commonNativeSettings) -lazy val ce3 = crossProject(JSPlatform, JVMPlatform) - .settings(commonSettings) - .dependsOn(core) - .settings( - name := "log4cats-cats-effect", - libraryDependencies ++= Seq( - "org.typelevel" %%% "cats-effect" % catsEffectV - ) - ) - lazy val slf4j = project .settings(commonSettings) .dependsOn(core.jvm) From fc05a9f49c9eed1907ee3a3a92b219cd9447108c Mon Sep 17 00:00:00 2001 From: Jay-Lokhande Date: Tue, 8 Apr 2025 21:38:31 +0530 Subject: [PATCH 22/22] sbt githubWorkflowGenerate --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ce5ea61..df64a8d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,11 +105,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p testing/jvm/target noop/jvm/target core/native/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target ce3/jvm/target project/target + run: mkdir -p testing/jvm/target noop/jvm/target core/native/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar testing/jvm/target noop/jvm/target core/native/target testing/native/target ce3/js/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target ce3/jvm/target project/target + run: tar cf targets.tar testing/jvm/target noop/jvm/target core/native/target testing/native/target noop/native/target core/js/target js-console/target testing/js/target noop/js/target core/jvm/target slf4j/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')