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

问题描述:

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

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

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

如果我做LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME),结果是org.slf4j.impl.Log4jLoggerAdapter的一个实例,甚至不是org.apache.log4j.Logger(正如我希望/预期的那样)。

有没有什么办法可以找到答案?

感谢, 埃里克

+1

请参阅:[如何找到哪个库slf4j已绑定自己?](http://*.com/questions/10505418) –

+0

谢谢。我不确定为什么我错过了原来的搜索。 –

SLF4J被设计成一个抽象的,而不是应用程序(当然,你可以而且应该仍然使用SLF4J在自己的应用程序的日志调用,一致性)。在您自己的应用程序中,您选择底层的记录器框架,因此可以在logging-config特定的部分访问log4j API。

没有办法应该库改变日志配置恕我直言,恕我直言,所以它不适合它在SLF4J API。

+3

如果SLF4J仅用于图书馆,那就够了。但是,在我看来,图书馆中如此灵活的东西也应该可用于您的应用程序。拥有可以插入任何日志框架的单一API的概念是非常棒的。此外,更多的时候,您的应用程序的一部分最终会被重构到某个库中。必须重新编码对log4j的任何引用才能成为slf4j是没有意义的。如果SL4j仅为图书馆设计(我没有在slf4j网站上阅读),我发现这是近视。 –

+3

对不起,没有说清楚:你应该使用SLF4J来处理你的应用程序的日志记录调用。但是在你的代码的一小部分中,处理更改日志记录配置,只需将这些内容投到Log4J类。如果您决定切换日志实现,那么您必须重写那一点。 – artbristol

+0

同意。只是试图一切做一切。我想这是不可行的。这甚至不是铸造的问题 - 我必须直接使用Log4j类进行调用(即:使用log4j.Logger代替slf4j.LoggerFactory来检索记录器) –