Netty 4.0和Log4J

时间:2013-07-06 22:29:08

标签: log4j netty slf4j

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

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

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

因为我确实需要他们为泽西岛正确使用Slf4J。

我已经看过以下问题,这些问题没有解决我的问题

2 个答案:

答案 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,请不要执行任何操作,因为在这种情况下可以安全地假设某人已将其配置在其他位置。