Skip to content

Commit

Permalink
Add logger level
Browse files Browse the repository at this point in the history
  • Loading branch information
geirolz committed Jul 4, 2023
1 parent d790821 commit b8dca08
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ object LoggerAdapter {
implicit def id[L[K[_]] <: ToolkitLogger[K]]: LoggerAdapter[L] =
new LoggerAdapter[L] {
override def toToolkit[F[_]](u: L[F]): ToolkitLogger[F] = new ToolkitLogger[F] {
override val loggerLevel: ToolkitLogger.Level = u.loggerLevel
override def info(message: => String): F[Unit] = u.info(message)
override def info(ex: Throwable)(message: => String): F[Unit] = u.info(ex)(message)
override def warn(message: => String): F[Unit] = u.warn(message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import cats.Applicative
sealed trait NoopLogger[F[_]] extends ToolkitLogger[F]
object NoopLogger {
def apply[F[_]: Applicative]: NoopLogger[F] = new NoopLogger[F] {
override val loggerLevel: ToolkitLogger.Level = ToolkitLogger.Level.Info
override def info(message: => String): F[Unit] = Applicative[F].unit
override def info(ex: Throwable)(message: => String): F[Unit] = Applicative[F].unit
override def warn(message: => String): F[Unit] = Applicative[F].unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.geirolz.app.toolkit.console.AnsiValue
import java.io.PrintStream

trait ToolkitLogger[F[_]] {
val loggerLevel: ToolkitLogger.Level
def info(message: => String): F[Unit]
def info(ex: Throwable)(message: => String): F[Unit]
def warn(message: => String): F[Unit]
Expand All @@ -20,23 +21,32 @@ trait ToolkitLogger[F[_]] {
}
object ToolkitLogger {

private sealed trait Level {
sealed trait Level {

def index: Int = this match {
case Level.Info => 0
case Level.Warn => 1
case Level.Error => 2
case Level.Debug => 3
}

def asString: String = this match {
case Level.Info => "INFO"
case Level.Warn => "WARN"
case Level.Error => "ERROR"
case Level.Debug => "DEBUG"
}
}
private object Level {
object Level {
case object Info extends Level
case object Warn extends Level
case object Error extends Level
case object Debug extends Level
}

def console[F[_]: Async](appInfo: SimpleAppInfo[?]): ToolkitLogger[F] = new ToolkitLogger[F] {
def console[F[_]: Async](appInfo: SimpleAppInfo[?], loggingLevel: Level = Level.Error): ToolkitLogger[F] = new ToolkitLogger[F] {

override val loggerLevel: Level = loggingLevel
override def info(message: => String): F[Unit] = log(Level.Info, Console.out)(message)
override def info(ex: Throwable)(message: => String): F[Unit] = logEx(Level.Info, Console.out)(ex, message)
override def warn(message: => String): F[Unit] = log(Level.Warn, Console.out)(message)
Expand All @@ -46,29 +56,37 @@ object ToolkitLogger {
override def debug(message: => String): F[Unit] = log(Level.Debug, Console.out)(message)
override def debug(ex: Throwable)(message: => String): F[Unit] = logEx(Level.Debug, Console.out)(ex, message)

private def log(lvl: Level, ps: PrintStream)(message: => String): F[Unit] =
Async[F].delay(ps.println(normalize(lvl, message)))
private def log(level: Level, ps: PrintStream)(message: => String): F[Unit] =
doIfNeeded(level) {
Async[F].delay(ps.println(normalize(level, message)))
}

private def logEx(lvl: Level, ps: PrintStream)(ex: Throwable, message: => String): F[Unit] =
Async[F].delay {
ps.println(normalize(lvl, message))
ex.printStackTrace(Console.err)
private def logEx(level: Level, ps: PrintStream)(ex: Throwable, message: => String): F[Unit] =
doIfNeeded(level) {
Async[F].delay {
ps.println(normalize(level, message))
ex.printStackTrace(Console.err)
}
}

private def doIfNeeded(level: Level)(f: F[Unit]): F[Unit] =
if (level.index <= loggerLevel.index) f else Async[F].unit

private def normalize(lvl: Level, msg: String): String = {

val color: AnsiValue = lvl match {
case Level.Info => AnsiValue.F.WHITE
case Level.Warn => AnsiValue.F.YELLOW
case Level.Error => AnsiValue.F.RED
case Level.Debug => AnsiValue.F.BLUE
case Level.Debug => AnsiValue.F.MAGENTA
}

color(s"[${appInfo.name.toString.toLowerCase}] ${lvl.asString} - $msg")
}
}

def mapK[F[_], G[_]](i: ToolkitLogger[F])(nat: F ~> G): ToolkitLogger[G] = new ToolkitLogger[G] {
override val loggerLevel: Level = i.loggerLevel
override def info(message: => String): G[Unit] = nat(i.info(message))
override def info(ex: Throwable)(message: => String): G[Unit] = nat(i.info(ex)(message))
override def warn(message: => String): G[Unit] = nat(i.warn(message))
Expand All @@ -77,5 +95,6 @@ object ToolkitLogger {
override def error(ex: Throwable)(message: => String): G[Unit] = nat(i.error(ex)(message))
override def debug(message: => String): G[Unit] = nat(i.debug(message))
override def debug(ex: Throwable)(message: => String): G[Unit] = nat(i.debug(ex)(message))

}
}
18 changes: 9 additions & 9 deletions core/src/test/scala/com/geirolz/app/toolkit/AppTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class AppTest extends munit.CatsEffectSuite {
counter: Ref[IO, Int] <- IO.ref(0)
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.dependsOn(_ => Resource.pure[IO, Ref[IO, Int]](counter).trace(LabeledResource.appDependencies))
.provideOne(_.dependencies.set(1))
Expand Down Expand Up @@ -65,7 +65,7 @@ class AppTest extends munit.CatsEffectSuite {
for {
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.dependsOn(_ => Resource.pure[IO, Unit](()).trace(LabeledResource.appDependencies))
.provideOneF(_ => IO.raiseError(ex"BOOM!"))
Expand Down Expand Up @@ -101,7 +101,7 @@ class AppTest extends munit.CatsEffectSuite {
for {
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provide(_ =>
Expand Down Expand Up @@ -143,7 +143,7 @@ class AppTest extends munit.CatsEffectSuite {
for {
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provideOne(_ => IO.sleep(1.second))
Expand Down Expand Up @@ -179,7 +179,7 @@ class AppTest extends munit.CatsEffectSuite {
for {
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provideF(_ =>
Expand Down Expand Up @@ -225,7 +225,7 @@ class AppTest extends munit.CatsEffectSuite {
_ <-
App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.dependsOn(_ => Resource.pure[IO, Unit](()).trace(LabeledResource.appDependencies))
.provideOne(_ => IO.raiseError(ex"BOOM!"))
Expand Down Expand Up @@ -263,7 +263,7 @@ class AppTest extends munit.CatsEffectSuite {
state <- IO.ref[Boolean](false)
_ <- App[IO]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provideOne(r =>
Expand Down Expand Up @@ -297,7 +297,7 @@ class AppTest extends munit.CatsEffectSuite {
state <- IO.ref[Boolean](false)
app <- App[IO, AppError]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provide(_ =>
Expand Down Expand Up @@ -339,7 +339,7 @@ class AppTest extends munit.CatsEffectSuite {
state <- IO.ref[Boolean](false)
app <- App[IO, AppError]
.withInfo(TestAppInfo.value)
.withLogger(ToolkitLogger.console[IO])
.withLogger(ToolkitLogger.console[IO](_))
.withConfig(TestConfig.defaultTest)
.withoutDependencies
.provide { _ =>
Expand Down

0 comments on commit b8dca08

Please sign in to comment.