在 Scala / Akka class 中记录多个值的最佳方式

Best way of logging multiple values in a Scala / Akka class

我现在需要将 Akka (Scala) 项目中的多个值记录到一个条目中。考虑以下伪代码,注释显示我在哪里拥有日志条目所需的信息。

def buildUrl() {
    // Item 1: Log url parameters
    val a = getMeSth(...)
    stuff(a);
}

def fetchUrl() {
    // Item 2: Log start time
    fetchAndHitAndRun(buildUrl())
}

def parseResponse() {
    // Item 3, 4, 5 ... 6: Log values from response
    // Item 7: Log time taken
    parseRsp(fetchUrl());
}

我需要来自多个函数的多个值来构建我的日志记录模型。我怎样才能在 Scala 中实现这一点?用信息填充 class 似乎是一种错误的方法...

我的理解是您想将所有这些值记录为一个事件。如有不妥请指正

最简单的方法是 return 从内部函数中获取您需要的值。

def buildUrl() {
    // Item 1: Log url parameters
    val a = getMeSth(...)
    val urlParameters = ???
    (stuff(a), urlParameters)
}

def fetchUrl() {
    val (stuff, urlParameters) = buildUrl()
    // Item 2: Log start time
    val startTime = ???
    (fetchAndHitAndRun(stuff), urlParameters, startTime)
}

...等等您需要的每一项。

另一种是使用一个 actor 收集它需要的所有项目,然后记录条目。

class TransactionLogger extends Actor with ActorLogging {
  override def receive = append(Map.empty)
  def append(entries: Map[String, Any] = {
    case Append(key, value) => 
      context become append(entries + (key -> value))
    case Log =>
      log.info("{}", entries)
      context stop self 
 }
}

因此,对于每笔交易,您都会创建此 actor,然后向其发送内容

val logger = system.actorOf(Props[TransactionLogger], transactionId)
logger ! Append("startTime", startTime)
logger ! Append("somethingElse", ???)

当你准备好冲掉它时

logger ! Log