【问题标题】:How to change slf4j level at runtime?如何在运行时更改 slf4j 级别?
【发布时间】:2012-06-21 19:08:43
【问题描述】:

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

我了解 slf4j 不允许直接通过其自己的 API 进行此操作,因此,我必须直接访问日志记录提供程序。就个人而言,我发现这是 slf4j 的一个巨大缺陷。所以现在我的问题是如何通过 slf4j 以编程方式确定我正在使用哪个提供程序?使用 slf4j 的最大目的是让您与提供者无关 - 您可以轻松地在您最喜欢的日志系统之间切换,而无需重新编码任何东西。但是现在,如果我必须直接调用 log4j,我就失去了这种能力。

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

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

有什么办法可以查到吗?

谢谢, 埃里克

【问题讨论】:

标签: java log4j slf4j


【解决方案1】:

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

图书馆不应该因为更改日志配置而胡思乱想,恕我直言,所以它不适合在 SLF4J API 上。

【讨论】:

  • 很公平,如果 SLF4J 仅用于库。但是,在我看来,库中如此灵活的东西也应该可以在您的应用程序中使用。拥有可以插入任何日志框架的单一 API 的概念非常棒。此外,您的应用程序的一部分通常会在某个时候被重构为库。必须重新编码对 log4j 的任何引用以成为 slf4j 是没有意义的。如果 SL4j 只是为图书馆设计的(我没有在 slf4j 网站上阅读),我认为这是短视的。
  • 抱歉,没有说清楚:您绝对应该使用 SLF4J 来记录应用程序的日志调用。但是在处理更改日志配置的代码的一小部分中,只需将内容转换为 Log4J 类。如果您决定切换日志记录实现,则无论如何您都必须重写该位。
  • 同意。只是想通用地做所有事情。我想这是不可行的。这甚至不是强制转换的问题——我必须直接使用 Log4j 类进行调用(即:使用 log4j.Logger 而不是 slf4j.LoggerFactory 来检索记录器)
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2012-11-06
  • 2011-02-06
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多