【问题标题】:Using Actor Logging Via SLF4j and logback vs using org.slf4j to log using SLF4J and logback通过 SLF4j 和 logback 使用 Actor 日志记录与使用 org.slf4j 使用 SLF4J 和 logback 进行日志记录
【发布时间】:2017-05-06 20:13:27
【问题描述】:

我对日志记录中使用的最佳实践感到困惑。我通过阅读发现 SLF4J 消除了应用程序和日志记录 API 等之间的耦合。所以如果我使用演员日志记录,它不会与应用程序紧密耦合吗?我还检查了很多 github 代码,我注意到它们只使用演员日志而不是 org.SLF4J.LoggerFactory 日志。为什么?

我提到的一些链接

SACHA'S BLOG OF PROGRAMMATICALNESS

Another Good read

stack Overflow -> 查了最后一个答案

提前致谢

【问题讨论】:

    标签: scala logging akka logback slf4j


    【解决方案1】:

    所以我们处于一个新的世界,一个我们想要反应和非阻塞但在此之前的一些信息的世界。

    Akka 用于记录 SLF4j api,它是常见日志库(即 log4j、logback)的一个外观,但执行所有这些异步操作是为了不阻塞 actor。

    所以:

    log.info("Received msg: {} use thread {} to dispatch", message, Thread.currentThread().getName());
    

    在日志定义为的actor中:

    LoggingAdapter log = Logging.getLogger(getContext().system(), this);
    

    向日志actor发送一条日志消息,IO操作实际上是由这个专门的actor完成的。

    Log4j 或 logback 只是实际日志记录的实现,这就是为什么您仍然需要在项目中配置 if 之一。

    log4j.appender.file.layout.ConversionPattern=[%d,%p] [%X{sourceThread}] [%c{1}.%M:%L] %m%n
    

    %X{sourceThread} 实际上为您提供了由原始参与者发出日志消息的执行线程,而不是在日志参与者内部执行 IO 操作的线程(由 %t 记录) - 更多关于 http://doc.akka.io/docs/akka/current/java/logging.html

    我的建议是使用 log4j 2,因为它使用的是异步操作,并且不会阻塞日志 actor 后面的线程 - 更多关于 https://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html 上的 log4j 2 性能的信息

    【讨论】:

    • 感谢您提供有关使用日志记录的信息。我的问题是,虽然我们有实现日志记录的 SLF4j API,但为什么我们使用 akka 日志记录而不是 SLF4j 的内置日志记录方法?
    • 因为正如我所解释的,不希望通过 IO 操作阻塞 Actor,以提高 Actor 的性能和吞吐量,这就是为什么希望在 Actor 内部使用 akka 日志记录,并且从那里实际日志记录将由 SLF4j 运送。
    • 太棒了!明白了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多