Scala 如何将异常stacktrace记录到调试级别?

Scala 如何将异常stacktrace记录到调试级别?,scala,logging,akka,slf4j,Scala,Logging,Akka,Slf4j,以下是akka中使用的调试级函数列表: def debug(message : scala.Predef.String) def debug(template : scala.Predef.String, arg1 : scala.Any) def debug(template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any) def debug(template : scala.Predef.String, arg1 : sc

以下是akka中使用的调试级函数列表:

def debug(message : scala.Predef.String)
def debug(template : scala.Predef.String, arg1 : scala.Any)
def debug(template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any)
def debug(template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any, arg3 : scala.Any)
def debug(template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any, arg3 : scala.Any, arg4 : scala.Any)
此处为错误级别函数列表:

def error(cause : scala.Throwable, message : scala.Predef.String)
def error(cause : scala.Throwable, template : scala.Predef.String, arg1 : scala.Any)
def error(cause : scala.Throwable, template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any)
def error(cause : scala.Throwable, template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any, arg3 : scala.Any)
def error(cause : scala.Throwable, template : scala.Predef.String, arg1 : scala.Any, arg2 : scala.Any, arg3 : scala.Any, arg4 : scala.Any)
因为在高负载系统中使用的代码,我只需要在调试级别记录异常stacktrace。要在调试级别进行日志记录,我必须编写:

//some where in try catch block
val log : akka.event.LoggingAdapter
val e : Exception

if (log.isDebugEnabled) {
    log.error(e, "Unexpected error")
}

在akka中除了混合级别之外还有更好的选择吗?

这里有一个类型类,它扩展了akka日志记录,这样就可以在
警告
信息
调试
级别上记录丢弃文件:

AkkaThrowableLogging 用法 输出:

[WARN] [10/16/2016 19:05:50.614] [ScalaTest-run-running-AkkaThrowableLoggingTest] [AkkaThrowableLoggingTest(akka://AkkaTest)] Hello world
java.lang.Exception: FooBarBaz
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(AkkaThrowableLoggingTest.scala:12)
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(AkkaThrowableLoggingTest.scala:11)
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(AkkaThrowableLoggingTest.scala:11)
    at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.Transformer.apply(Transformer.scala:22)
    ...
警告:错误级别上的日志输出可能与较低级别不同
该异常不能传递给底层日志框架(例如log4j、logback等),因为Akka的LoggingAdapter没有为此提供API。因此,该异常不能在该级别上格式化,而是由
throwableStr
函数处理,该函数使用默认的Java格式(调用
printStackTrace
时得到的格式)。因此,
log.error(e,…)
的日志输出可能不同于
log.warning(,…)
log.info(e,…)
log.debug(e,…)
。大多数情况下,不会注意到任何差异,因为例外情况的格式是默认格式。

标题中有输入错误。超出?为什么不直接使用
log.debug
?底层日志库正在执行相同的if-check。如果字符串需要concat某些变量,则应将它们作为其他参数传递(这样字符串concat仅在必要时执行),因为
log.debug
没有Throuble参数。将异常传递给它参数只打印
exception.getMessage
import AkkaThrowableLogging._
log.warning(new Exception("FooBarBaz"), "Hello {}", "world")
[WARN] [10/16/2016 19:05:50.614] [ScalaTest-run-running-AkkaThrowableLoggingTest] [AkkaThrowableLoggingTest(akka://AkkaTest)] Hello world
java.lang.Exception: FooBarBaz
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(AkkaThrowableLoggingTest.scala:12)
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(AkkaThrowableLoggingTest.scala:11)
    at test.AkkaThrowableLoggingTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(AkkaThrowableLoggingTest.scala:11)
    at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22)
    at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.Transformer.apply(Transformer.scala:22)
    ...