akka.actor.ActorLogging没有通过logback记录异常的堆栈跟踪

10
我正在使用Logback + SLF4J来记录那些带有akka.actor.ActorLogging特征的actor的日志。然而,当我执行代码log.error("Error occur!", e)时,异常e的堆栈跟踪没有被记录,只打印了一行Error occur! WARNING arguments left: 1。我想知道为什么以及如何在日志文件中打印堆栈跟踪。谢谢。以下是我的logback.groovy文件配置。
appender("FILE", RollingFileAppender) {
  file = "./logs/logd.txt"
  append = true
  rollingPolicy(TimeBasedRollingPolicy) {
    fileNamePattern = "./logs/logd.%d{yyyy-MM-dd}.log"
    maxHistory = 30
  }
  encoder(PatternLayoutEncoder) {
    pattern = "%date{ISO8601} [%thread] %-5level %logger{36} %X{sourceThread} - %msg%n"
  }
}
root(DEBUG, ["FILE"])

我遇到了同样的问题。作为临时解决方案,我只是用typesafe.scalalogging提供的LazyLogging替换了ActorLogging,并在所有我的actors中将log.替换为logger.。但要注意,这样做会在日志中失去actor地址字符串。因此,在找到真正的解决方案之前,可以使用此方法。 - Uniqus
2个回答

20

Akka有独立的日志记录功能,其在Akka的application.conf文件中进行配置。如果你想要将其桥接到SLF4J/Logback,可以使用以下设置:

akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  logging-filter = "akka.event.slf4j.Slf4jLoggingFilter"
}
akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
}

参见:http://doc.akka.io/docs/akka/2.0/scala/logging.html

据我所见,在这里,log.error的第一个参数应该是原因(Throwable):

 def error(cause: Throwable, message: String)

这就是为什么你会看到 "WARNING arguments left" - 因为你的 Throwable 参数被忽略了。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Uniqus
1
问题已经被编辑过了,所以我没有看到有关堆栈跟踪的更新。我认为原因只是log.error的使用不正确 - 我已经编辑了我的答案。 - dk14
2
我这里也有同样的问题 - throwable 应该是第一个参数,而不是最后一个。 - JasonG

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接