Как подавить сообщения журнала из внешних библиотек, используя 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.