如何使用 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.
我正在使用 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.