如何在运行时更改slf4j级别?

15

我一直在使用SLF4j作为我的日志框架,由log4j支持。我的问题是,我正在寻找一种在运行时更改记录器的日志级别的方法。

我了解到slf4j不允许直接通过自己的API实现此功能,因此,我必须直接访问日志提供程序。个人认为这是slf4j的一个巨大缺陷。那么现在我的问题是如何通过slf4j编程确定我正在使用哪个提供程序?使用slf4j最大的目的是您成为提供者无关 - 您可以轻松地在喜欢的日志系统之间切换,而无需重新编写任何内容。但是,如果我必须直接调用log4j,那么我就失去了这个能力。

至少,我希望能够确定是否正在使用log4j作为提供程序,如果是,则允许用户切换日志级别。

如果我执行LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME),结果是org.slf4j.impl.Log4jLoggerAdapter的一个实例,甚至不是我所希望/期望的org.apache.log4j.Logger

有没有办法找出这一点呢?

谢谢, Eric


1
请参见:如何找到slf4j绑定的库? - Tomasz Nurkiewicz
谢谢。我不确定为什么在我的原始搜索中错过了那个。 - Eric B.
1个回答

13

SLF4J被设计成一个的抽象,而不是应用程序(当然,在你自己的应用程序中,你仍然可以和应该使用SLF4J来进行日志调用,以保持一致性)。在你自己的应用程序中,你可以选择底层的日志记录框架,因此在特定于日志配置的部分访问log4j API是可以的。

在我看来,绝不能让库胡乱更改日志配置,所以将其放在SLF4J API上是不合适的。


3
如果 SLF4J 仅用于库,则没问题。但是在我的看法中,一个如此灵活的库也应该可供应用程序使用。拥有一个单一的 API,可以插入任何日志框架的概念非常棒。此外,往往你的应用程序的一部分最终会重构为一个库。必须重新编码任何引用 log4j 的代码以成为 slf4j 是没有意义的。如果 SL4j 只设计用于库(我在 slf4j 网站上没有看到这样的说法),我认为这是短视的。 - Eric B.
3
抱歉,我之前没有表述清楚:你的应用程序在记录日志时应该一定使用SLF4J。但是,在处理更改日志配置的小节代码中,只需将其转换为Log4J类。如果您决定切换记录实现方式,那么您必须重新编写那部分代码。 - artbristol
同意。只是试图以通用方式完成所有事情。我想这是不可行的。这甚至不是一个强制转换的问题——我必须直接使用Log4j类进行调用(即使用log4j.Logger而不是slf4j.LoggerFactory来检索日志记录器)。 - Eric B.

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