Scala 如何将异常stacktrace记录到调试级别?
以下是akka中使用的调试级函数列表: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
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)
...