我正在使用在Tomcat 6.0应用程序中运行的Netty 4.0(CR9)。我正在使用Log4J通过Slf4J。我的应用程序中的所有组件都使用Log4J,desipte Netty。我在启动期间收到以下消息:
log4j:WARN No appenders could be found for logger (io.netty.util.internal.logging.InternalLoggerFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
我在启动侦听器中有以下几行代码
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();"
因为我确实需要他们为泽西岛正确使用Slf4J。
我已经看过以下问题,这些问题没有解决我的问题
答案 0 :(得分:1)
我在这个问题中找到了问题的解决方案:Where to place log4j.xml。如果使用“-Dlog4j.debug”作为构建Web应用程序的参数,它会显示使用哪些appender。
我的案例中的问题是找到了正确的log4j.xml,但版本不正确。 (错过了正确的appender)。通过将appender添加到log4j使用的版本,它可以工作。
我的Appender看起来像
<category name="io.netty">
<priority value="warn"/>
<appender-ref ref="Console"/>
</category>
答案 1 :(得分:0)
对于以编程方式配置日志记录的任何人(就像我一样,为了某些单元测试),可能不需要去设置log4j.xml
在Netty的情况下,许多类尝试在类加载阶段访问其Logger,因此您必须确保事先进行任何编程初始化。
因此,例如,如果您要声明一个Netty静态成员,请确保事先进行静态初始化(类中成员的排序是相关的),例如
static {
Logging.initialise();
}
static ByteBufAllocator alloc = new UnpooledByteBufAllocator(true);
如果它是一个您不想触及的常见实用程序类,并且在初始化后执行编程日志记录,您可以设置 null appender:
static {
/* Eliminate Log4j warning when instantiating 'alloc' below */
Logger rootLogger = Logger.getRootLogger();
/* Check that an appender hasn't already been set */
if (!rootLogger.getAllAppenders().hasMoreElements()) {
rootLogger.addAppender(new NullAppender());
}
}
static ByteBufAllocator alloc = new UnpooledByteBufAllocator(true);
请注意,如果已经设置了Appender,请不要执行任何操作,因为在这种情况下可以安全地假设某人已将其配置在其他位置。