Netty 4.0和Log4J

4

我正在使用运行在Tomcat 6.0应用程序中的Netty 4.0 (CR9)。 我通过Slf4J使用Log4J。 尽管Netty存在,但我的应用程序中的所有组件都使用Log4J。 在启动期间,我收到以下消息:

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.
  • 我已经在应用程序的资源文件夹中拥有一个log4j.xml(因此其他组件知道如何记录日志)
  • 我尝试将“InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());”或“InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory());”放置在WebApp的ContextListener中以在启动时配置记录器。 将它们放在静态上下文中也不起作用。
  • 在Intitalizer中添加日志处理程序无效。

我在启动监听器中有以下代码行

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();"

我需要它们来让Jersey正确使用Slf4J。

我已经查看了以下问题,但没有解决我的问题:

2个回答

2

对于那些以编程方式配置其日志记录的人(就像我一样,为了进行一些单元测试),可能不希望去设置log4j.xml。

在Netty的情况下,许多类尝试在类加载阶段访问它们的记录器,因此您必须确保您想要进行的任何编程初始化发生在此之前。

例如,如果您正在声明一个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,则不要执行任何操作,因为在这种情况下,可以安全地假设其他人已经进行了配置。

1
我在这个问题中找到了解决方案:log4j.xml应该放在哪里。如果您在构建Web应用程序时使用“-Dlog4j.debug”作为参数,则它会向您显示所使用的附加器。
在我的情况下,问题是找到了正确的log4j.xml文件,但版本不正确(缺少正确的附加器)。通过将附加器添加到log4j使用的版本中,问题得以解决。
我的Appender看起来像这样:
<category name="io.netty">
    <priority value="warn"/>
    <appender-ref ref="Console"/>
</category>

对于Log4J 2.x:<Logger name="io.netty" level="info" additivity="false"> <AppenderRef ref="Console"/> </Logger> - Mohammad Haseeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接