我在我的Play应用程序中添加日志记录,为了避免繁琐和重复的代码,我创建了一个带有格式化函数的case类,以便清理我的日志:
final case class LogMessage(keyValuePairs: (String, String)*) {
def jsonify: String =
s"""{${keyValuePairs map { case (key, value) => s""""$key":"$value"""" } mkString "," }}"""
}
目前,为了调用此方法,我必须执行以下操作:
Logger.info(LogMessage(("message", s"here is my message")).jsonify)
// jsonify prints:
// {"message":"here is my message"}
这样运行正常,但我不喜欢每次创建一个新的case类后我需要写.jsonify
。是否有办法在创建LogMessage
案例类时自动调用此方法,因此我的代码中没有写jsonify
?我已经阅读了有关隐式方法的内容,但只是将方法更改为implicit def jsonify = ...
并没有做任何事情。
答案 0 :(得分:3)
这可以通过覆盖toString
的{{1}}方法来解决,但也有更好的选择。
由于实际上不需要使用LogMessage
的实例,我们可以使用LogMessage
方法实现object
,该方法将用作从元组到jsonified String的转换器:< / p>
apply()
可以用作:
object JsonifiedMessage {
def apply(keyValuePairs: (String, Any)*): String = {
val jsonified = keyValuePairs.map { case (key, value) => s""""$key":"$value"""" }.mkString(",")
s"{${jsonified}}"
}
}