【发布时间】:2020-05-06 13:41:08
【问题描述】:
我主要使用猫库来开发一个 Scala 项目。在那里,我们有类似的电话
for {
_ <- initSomeServiceAndLog("something from a far away service")
_ <- initSomeOtherServiceAndLog("something from another far away service")
a <- b()
c <- d(a)
} yield c
想象一下 b 也记录了一些东西或者可能抛出一个业务错误(我知道,我们避免在 Scala 中抛出,但现在情况并非如此)。我正在寻找一种解决方案来累积日志并最终在一条消息中将它们全部打印出来。 对于一条幸福的道路,我看到 Cats 的 Writer Monad 可能是一个可以接受的解决方案。 但是如果 b 方法抛出怎么办?要求是在一条消息中记录所有内容——所有以前的日志和错误消息,并带有某种唯一的跟踪 ID。 有什么想法吗?提前致谢
【问题讨论】:
-
这比听起来要难。
Writer[L, A]基本上是一个允许组合函数的包装器:A => (L, A2)这样L将被传递并有时附加到。WriterT[F, L, A]将允许A => F[(L A2)]- 这意味着如果F中的值变为失败(因为它是例如Try、Future或其他 IO),那么到目前为止所有结果都会消失。您将不得不引入一个新的 monad,它代表A => (L, F[A2])... 但这比听起来要难。就我个人而言,我可能会选择Ref(来自 Cats Effect)或TaskLocal(来自 Monix)并写信给它。 -
您能否详细说明在方法抛出时如何使用 Ref 来控制日志累加器?
-
如何将 WriteT 与 Either 作为 F 一起使用。确保您的 Either 捕获所有内容。
标签: scala logging scala-cats