0

我在一个使用 slf4j 和 log4j2 作为底层日志框架的应用程序上工作。该应用程序根据应用程序的当前用户提供自定义日志过滤器。一些第三方库java.util.logging在内部使用 (JUL)。我希望这些日志也提交给我的基于用户的过滤器。即,虽然默认日志级别可能是ERROR,但我可以将应用程序配置为在DEBUG特定用户使用它时登录级别。

因此,我集成了jul-to-slf4j桥,以便将 JUL 日志重定向到 slf4j。我还创建了一个自定义的 java.util.logging.Filter ,如此处所述,它实现了我的基于用户的过滤器逻辑。

现在我的问题是 JUL 中的默认日志级别似乎是INFO,并且还有逻辑首先检查要记录的消息的级别是否低于记录器的级别,在这种情况下,消息会立即被拒绝而不会通过过滤器(在本例中是我的自定义过滤器)。正因为如此,我希望所有 JUL 记录器(也是第三方库中使用的)默认具有该级别ALL,以便所有 JUL 日志语句都将通过我的过滤器,在该过滤器中确定是记录消息还是丢弃它。

我已经尝试将 JULs 根记录器及其处理程序级别设置ALL为在 SO 上的多个帖子中所描述的那样,但这似乎并没有像这里看到的那样产生技巧。看起来我必须LogManager相应地配置 JUL,我想知道是否可以在不引入新日志文件的情况下以编程方式进行配置?

4

1 回答 1

1

从代码中,您可以使用如下代码重置所有记录器:

private static void resetLoggersToRoot() {
    Logger root = Logger.getLogger("");
    LogManager lm = LogManager.getLogManager();
    synchronized (lm) {
        Enumeration<String> e = lm.getLoggerNames();
        while (e.hasMoreElements()) {
            Logger l = lm.getLogger(e.nextElement());
            if (l != null && l != root) {
                l.setLevel(root.getLevel());
                l.setFilter(root.getFilter());
                l.setUseParentHandlers(root.getUseParentHandlers());
                for(Handler h : l.getHandlers()) {
                    l.removeHandler(h);
                }
            }
        }
    }
}

但是,存在按需创建记录器的问题。因此,您可能必须调用以从文件LogManager.getLogManager().reset();中删除任何现有配置。logging.properties

于 2020-02-15T18:35:31.657 回答