Как подавить сообщения журнала из внешних библиотек, используя log4j

Я использую log4j2, чтобы сделать некоторые записи для проекта. Мой раздел Loggers в моей конфигурации выглядит следующим образом.

<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>

Похоже, что это не оказывает никакого влияния на подавление сообщений уровня DEBUG от io.netty.util

Я погуглил "io.netty.util logging" и придумал это. Похоже, есть способ переопределить регистратор по умолчанию

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 ответ

Решение

Если логгер определен в log4j 1.x api (оригинальная версия ответа):

Проблема в том, что log4j 1.x api не использует свойство log4j2.

Добавьте log4j-1.2-api.jar в качестве моста log4j 1.x, это должно решить вашу проблему.

Но, по умолчанию, в качестве логгера для netty используется Slf4JLoggerFactory, поэтому на самом деле нужны мосты slf4j. от slf4j-log4j12 до log4j 1.x, от log4j-slf4j-impl до log4j2.x.

Другие вопросы по тегам