-
Notifications
You must be signed in to change notification settings - Fork 2
/
Main.scala
64 lines (59 loc) · 2 KB
/
Main.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package test
import cats.effect.IOApp
import cats.effect.ExitCode
import cats.effect.IO
import logger._
import logger.fs2interop._
import logger.frontend.Logger
import cats.syntax.all._
import logger.Log.Builder
import cats.Monad
object Main extends IOApp {
class ThresholdAwareLogger[F[_]: Monad](
logThreshold: F[Double],
kernel: LoggerKernel[F]
) extends LoggerKernel[F] {
def log(level: LogLevel, record: Builder => Builder): F[Unit] =
logThreshold.flatMap { t =>
if (level.value < t) Monad[F].unit
else (kernel.log(level, record))
}
}
def run(args: List[String]): IO[ExitCode] =
QueuedLogger
.toStdout[IO]()
.map(AddTimestamp(_))
.map(Logger.wrap(_))
.use { logger =>
// This is a direct call to the logger kernel interface.
// The user is expected to provide a function to add information
// to some log builder.
//
// This is applying inversion of control so that the
// LoggerKernel implementation can decide on the memory layout
// of the data.
val loggerKernelCall = logger
.log(
LogLevel.Warn,
_.withMessage("hello")
.withContext("string")("some_string")
.withContext("int")(1)
.withThrowable(new Exception("BOOM"))
)
// This showcases a higher level UX, using a varargs-taking methods
// combined with the "typeclassed" pattern in order to capture the same
// information in a more concise way.
//
// Additionally, the higher-level interface depends on Haoyi's Sourcecode
// library, automating the capture of information about where
// the log statement was issued (classname, file, line).
val higherLevelLoggerCall = logger.info(
"hello",
"string" -> "some_string",
"int" -> 1,
new Exception("KABOOM")
)
loggerKernelCall *> higherLevelLoggerCall
}
.as(ExitCode.Success)
}