如何使用 log4j 抑制来自外部库的日志消息

How do I supress log messages from external libraries, using log4j

我正在使用 log4j2 为项目做一些日志记录。我的配置中的记录器部分如下所示。

<Loggers>

    <!-- default logger -->
    <Root level="info">
        <AppenderRef ref="Console"/>
    </Root>

    <!-- only log warn/error/fatal for external libs -->
    <Logger name="org.cfg4j" level="warn" additivity="false">
        <AppenderRef ref="Console"></AppenderRef>
    </Logger>
    <Logger name="io.netty.util" level="warn" additivity="false">
        <AppenderRef ref="Console"></AppenderRef>
    </Logger>

</Loggers>

就抑制来自 io.netty.util

的 DEBUG 级别消息而言,这似乎没有任何效果

我用谷歌搜索 "io.netty.util logging" 并得出 this。看起来有一种方法可以覆盖默认记录器

public abstract class InternalLoggerFactory {
private static volatile InternalLoggerFactory defaultFactory;

static {
    final String name = InternalLoggerFactory.class.getName();
    InternalLoggerFactory f;
    try {
        f = new Slf4JLoggerFactory(true);
        f.newInstance(name).debug("Using SLF4J as the default logging framework");
        defaultFactory = f;
    } catch (Throwable t1) {
        try {
            f = new Log4JLoggerFactory();
            f.newInstance(name).debug("Using Log4J as the default logging framework");
        } catch (Throwable t2) {
            f = new JdkLoggerFactory();
            f.newInstance(name).debug("Using java.util.logging as the default logging framework");
        }
    }

    defaultFactory = f;
}

我试着尝试一下,但我 运行 遇到了一些问题。其一,我的 IDE (intellij) 告诉我 Log4JLoggerFactory 已被弃用。我继续,但后来发现该实例不包含名为 "newInstance".

的方法

所以,我对如何进行这件事有点困惑。有没有办法让 log4j 以我想的方式抑制外部库 DEBUG/INFO 级别的消息?

如果logger定义在log4j中1.x api(原版答案):

问题是 log4j 1.x api 不要使用 log4j2 属性。

添加 log4j-1.2-api.jar,作为 log4j 1.x 桥,它应该可以解决您的问题。

但是netty的默认loggerfactory似乎是Slf4JLoggerFactory,所以真正需要的是slf4j桥。 slf4j-log4j12 到 log4j 1.x,log4j-slf4j-impl 到 log4j2.x.