Scala中的事件记录器模式

时间:2018-04-14 04:38:00

标签: scala scala-cats

我们所有的后端服务都是用Scala编写的。我们主要使用Cats编写纯函数Scala。

我试图弄清楚Cats或Scala中是否有一个设计模式,我可以用来设计一个EventLogger。

此eventLogger应收集"事件" (简单的键值)当请求流过逻辑时。在请求结束时,我想将收集的事件写入数据存储。我们已经有了一个" context"传递给所有方法的隐式参数。我可以将这个EventLogger添加到我的Context类中,它可以从我的代码的大部分内容访问事件记录器。现在我试图弄清楚如何设计eventLogger本身,而不使用可变集合。

我已经习惯了akka演员过去收集状态来管理变异状态。我不想仅为此将Akka引入我们的类路径中。

1 个答案:

答案 0 :(得分:1)

正如@AndreyTyukin所说,Writer在这里会很好用。

您可以执行以下操作:

object EventLogger {
  type Event = (String, String)
  def log(event: Event): Writer[Vector[Event], Unit] =
    Writer.tell(Vector(event))
}

然后你可以像这样使用它:

// Example usage
for {
  something <- Writer.value(myFunc(arg))
  _ <- EventLogger.log("function_finished" -> "myFunc")
  somethingElse <- Writer.value(myFunc2(arg2))
  _ <- EventLogger.log("function_finished" -> "myFunc2")
} yield combine(something, somethingElse)

在此结束时,您将获得某种Writer[Vector[Event], ?]值,其中?可能是您感兴趣的值,Vector[Event]就是您的全部Event log {1}}数据已准备就绪,您可以使用。

通常Writer也不是您想要使用的唯一容器。您可能希望调查Monad Transformers以堆叠容器或类似Eff