diff --git a/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpFactory.scala b/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpFactory.scala index 5d3e191e..61d8f0b8 100644 --- a/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpFactory.scala +++ b/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpFactory.scala @@ -22,13 +22,19 @@ import cats.Applicative object NoOpFactory extends LoggerFactoryGenCompanion { def apply[F[_]: Applicative]: LoggerFactory[F] = impl[F] - def impl[F[_]](implicit F: Applicative[F]): LoggerFactory[F] = new LoggerFactory[F] { - override def getLoggerFromName(name: String): SelfAwareStructuredLogger[F] = { - val _ = name - NoOpLogger.impl[F] + def strictEvalArgs[F[_]: Applicative]: LoggerFactory[F] = impl_[F](evaluateArgs = true) + + def impl[F[_]](implicit F: Applicative[F]): LoggerFactory[F] = impl_[F](evaluateArgs = false) + + private def impl_[F[_]](evaluateArgs: Boolean)(implicit F: Applicative[F]): LoggerFactory[F] = + new LoggerFactory[F] { + override def getLoggerFromName(name: String): SelfAwareStructuredLogger[F] = { + val _ = name + NoOpLogger.impl_[F](evaluateArgs) + } + + override def fromName(name: String): F[SelfAwareStructuredLogger[F]] = + F.pure(getLoggerFromName(name)) } - override def fromName(name: String): F[SelfAwareStructuredLogger[F]] = - F.pure(getLoggerFromName(name)) - } } diff --git a/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpLogger.scala b/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpLogger.scala index 7050b55e..95762949 100644 --- a/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpLogger.scala +++ b/noop/shared/src/main/scala/org/typelevel/log4cats/noop/NoOpLogger.scala @@ -21,10 +21,20 @@ import org.typelevel.log4cats.SelfAwareStructuredLogger object NoOpLogger { def apply[F[_]: Applicative]: SelfAwareStructuredLogger[F] = impl[F] - def impl[F[_]: Applicative]: SelfAwareStructuredLogger[F] = new SelfAwareStructuredLogger[F] { + + def strictEvalArgs[F[_]: Applicative]: SelfAwareStructuredLogger[F] = + impl_[F](evaluateArgs = true) + + def impl[F[_]: Applicative] = impl_[F](evaluateArgs = false) + + private[noop] def impl_[F[_]: Applicative](evaluateArgs: Boolean): SelfAwareStructuredLogger[F] = + if (evaluateArgs) strictImpl else lazyImpl + + private def lazyImpl[F[_]: Applicative] = new SelfAwareStructuredLogger[F] { val no: F[Boolean] = Applicative[F].pure(false) val unit: F[Unit] = Applicative[F].pure(()) + @inline override def isTraceEnabled: F[Boolean] = no @inline override def isDebugEnabled: F[Boolean] = no @inline override def isInfoEnabled: F[Boolean] = no @@ -56,4 +66,45 @@ object NoOpLogger { @inline override def error(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = unit } + + private def strictImpl[F[_]: Applicative] = new SelfAwareStructuredLogger[F] { + + val yes: F[Boolean] = Applicative[F].pure(true) + def void(arg: => Any): F[Unit] = Applicative[F].pure { + val _ = arg + () + } + + @inline override def isTraceEnabled: F[Boolean] = yes + @inline override def isDebugEnabled: F[Boolean] = yes + @inline override def isInfoEnabled: F[Boolean] = yes + @inline override def isWarnEnabled: F[Boolean] = yes + @inline override def isErrorEnabled: F[Boolean] = yes + @inline override def trace(t: Throwable)(msg: => String): F[Unit] = void(t) + @inline override def trace(msg: => String): F[Unit] = void(msg) + @inline override def trace(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg) + @inline override def debug(t: Throwable)(msg: => String): F[Unit] = void(msg) + @inline override def debug(msg: => String): F[Unit] = void(msg) + @inline override def debug(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg) + @inline override def info(t: Throwable)(msg: => String): F[Unit] = void(msg) + @inline override def info(msg: => String): F[Unit] = void(msg) + @inline override def info(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg) + @inline override def warn(t: Throwable)(msg: => String): F[Unit] = void(msg) + @inline override def warn(msg: => String): F[Unit] = void(msg) + @inline override def warn(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg) + @inline override def error(t: Throwable)(msg: => String): F[Unit] = void(msg) + @inline override def error(msg: => String): F[Unit] = void(msg) + @inline override def error(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg) + @inline override def trace(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = + void(msg) + @inline override def debug(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = + void(msg) + @inline override def info(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = + void(msg) + @inline override def warn(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = + void(msg) + @inline override def error(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] = + void(msg) + } + }