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

时间:2017-06-15 20:18:20

标签: java logging log4j override grpc

我正在使用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级别消息,这似乎没有任何影响

我用Google搜索“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级别的消息?

1 个答案:

答案 0 :(得分:1)

如果记录器是在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。