Scala中的事件记录器模式

Scala中的事件记录器模式,scala,scala-cats,Scala,Scala Cats,我们所有的后端服务都是用Scala编写的。我们主要使用Cats编写纯函数Scala 我正试图弄清楚在Cats或Scala中是否有一种设计模式,可以用来设计事件记录器 当请求流经逻辑时,此事件记录器应收集“事件”(简单键值)。在请求结束时,我想将收集到的事件写入数据存储。我们已经有了一个“context”隐式参数,可以传递给所有方法。我可以将这个EventLogger添加到我的上下文类中,它可以从我代码的大部分部分访问事件记录器。现在,我试图弄清楚如何设计eventLogger本身,而不使用可变集

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

我正试图弄清楚在Cats或Scala中是否有一种设计模式,可以用来设计事件记录器

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


过去,我习惯于akka参与者收集状态以管理突变状态。我不希望仅仅为了这个而将Akka引入我们的类路径。

正如@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)
//示例用法
为了{

为什么不使用
WriterT