【问题标题】:Log4j: Change log level programmatically that works for to-be created loggersLog4j:以编程方式更改日志级别,适用于要创建的记录器
【发布时间】:2014-10-19 19:54:51
【问题描述】:

我在我的代码中这样声明记录器:

Logger logger = LoggerFactory.getLogger(MyClass.class);

我希望能够在运行时以编程方式更改我的记录器的日志级别。我尝试通过 LogManager 迭代存储库中的记录器,但它仅将新的日志级别应用于在代码中实例化的记录器。如果创建了新的记录器实例,它不会使用新的日志级别。我的要求是我的 Web 应用程序中的日志级别需要通过管理 GUI 进行配置,并且这个新的日志级别需要应用于我的代码中的所有记录器(不包括第三方库日志记录,例如 JSF、Spring、Hibernate 等) .

这就是我现在正在做的,它不符合我的要求,因为它不会将日志级别应用于新实例化的记录器:

Enumeration<Logger> currentLoggers = LogManager.getCurrentLoggers();
while(currentLoggers.hasMoreElements()) {
    Logger logger = currentLoggers.nextElement();
    if (StringUtils.startsWith(logger.getName(), "com.my.company")) {
        logger.setLevel(logLevel);
    }
}

我正在使用 Log4j 1.2.17。

【问题讨论】:

  • 您需要以编程方式更改您的 log4j 配置。不仅是已经实例化的 Logger。见stackoverflow.com/a/4598829/982149
  • @Fildor,阅读该帖子后,我仍然不确定解决方案是什么。我不能做 LogManager.getRootLogger().setLevel(Level.DEBUG);因为它会更改根记录器,这将影响所有日志级别,包括来自 3rd 方库的日志级别。
  • 我的 log4j 有点生锈,但我认为你可以为“com.my.company”设置日志级别,它会影响所有子 Logger。我会尽快回复你...
  • 这似乎奏效了。我很早就尝试过,但觉得它不起作用。也许还有其他问题。现在它似乎工作了,谢谢!如果您将其发布为答案,我会接受。

标签: java log4j


【解决方案1】:

已经找不到资源了,但至于我褪色的记忆LogManager.getLogger("com.my.company").setLevel(whateverloglevel) 应该可以完成这项工作。

所有使用LogManager.getLogger(MyClass.class) 创建且 MyClass 位于 com.my.company 或其子树中的记录器都会受到影响。

whateverloglevelLevel 之一:

全部
    ALL 的等级最低,旨在打开所有日志记录。
调试
    调试级别指定对调试应用程序最有用的细粒度信息事件。
错误
    错误级别指定可能仍允许应用程序继续运行的错误事件。
致命
    FATAL 级别表示可能导致应用程序中止的非常严重的错误事件。
信息
    INFO 级别指定了在粗粒度级别突出应用程序进度的信息性消息。
关闭
    OFF 具有最高等级,旨在关闭日志记录。
追踪
    TRACE 级别指定了比 DEBUG 更细粒度的信息事件
WARN
    WARN 级别表示潜在的有害情况。

请注意,这可能在 log4j 中不起作用2

对于(我认为)版本 >= 2.4,请参阅:

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2019-05-06
    • 2011-04-19
    • 2012-09-20
    • 2018-06-27
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多