在 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
我现在需要将 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