【问题标题】:Akka & SLF4J ConfigurationAkka 和 SLF4J 配置
【发布时间】:2015-06-01 19:29:37
【问题描述】:

我阅读了Akka Logging tutorial,但对于如何让 Akka 使用 SLF4J 仍然有些困惑。我的理解是正确的,大致流程是:

  1. 在运行时类路径中包含akka-slf4j 模块,该模块可传递地引入slf4j-api
  2. 在运行时类路径中包含 SLF4J 后端,例如 Logback
  3. 配置日志记录后端(不知何故,见下文)
  4. 像平常一样实例化和使用 SLF4J 记录器

首先,如果我错过或误解了上述任何步骤,请先纠正我!假设我或多或少是正确的,我仍然对两件事完全一无所知:

  • 我是配置 Akka 还是配置 SLf4J“后端”(绑定)? (见下文)
  • 为什么我不像往常一样实例化 SLF4J 记录器? (见下文)

配置

如果我通常使用 SLF4J/Logback,我会确保运行时类路径中有一个 logback.xml 文件。或者,如果我使用的是slf4j-simple,我会确保运行时类路径中有一个slf4j.properties 文件。但是对于 Akka,我似乎需要像这样声明一个 akka.loggers 部分:

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

...和/或像往常一样配置 SLF4J 绑定。 那是哪个?

记录器实例化

我不明白你为什么不像往常一样实例化 SL4J 记录器。 通常,在演员/演员系统之外,我的记录器实例化如下所示:

public class FizzBuzz {
    Logger logger = Logger.getLogger(FizzBuzz.class);

    // ...etc.
}

但在 Akka 文档中,我似乎必须像这样实例化它们:

public class FizzBuzz {
    LoggingAdapter log = Logging.getLogger(system.eventStream(), "my.string");

    // ...etc.
}

为什么?!?!

另外,如果有人可以向我解释“MDC 价值观”(???) 和 DiagnosticLoggingAdapter 的用途/目的,则可以加分。

【问题讨论】:

  • 对于 MDC,官方文档explain it the best。他们还引用了解释该概念的 Logback 页面。

标签: akka slf4j


【解决方案1】:

Akka 也出于非阻塞原因使用 actor 进行日志记录。每次你想记录一些东西并使用 Akka 提供的记录器(比如添加 ActorLogging trait 后可用的记录器)时,它实际上会向日志记录参与者发送一条消息,并且参与者会注意与后端日志框架交互你的选择。

关于MDC,它通常用于能够根据某个值过滤和发送数据到不同的appender。 MDC 代表映射诊断上下文,这意味着您将拥有一个包含一些值的上下文,您可以使用这些值以一种智能且优雅的方式分发您的日志。

【讨论】:

  • 感谢 @hveiga (+1) - 关于日志配置的快速跟进:我 (a) 是否使用 Akka 日志配置(类似于 akka { ... } 闭包以上)或(b)使用both Akka日志配置 logback.xml?
  • 两者都需要。您需要将 akka 记录器设置为 slf4j,然后为所有附加程序和记录器配置 logback.xml。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多