4

我正在使用在 Tomcat 6.0 应用程序中运行的 Netty 4.0 (CR9)。我通过 Slf4J 使用 Log4J。我的应用程序中的所有组件都使用 Log4J,除了 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。

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

4

2 回答 2

2

对于以编程方式配置日志记录的任何人(就像我一样,为了一些单元测试),可能不需要去设置 log4j.xml

在 Netty 的情况下,许多类尝试在类加载阶段访问它们的 Logger,因此您必须确保您想要做的任何编程初始化都事先发生。

因此,例如,如果您要声明 Netty 静态成员,请确保事先进行静态初始化(类中成员的顺序是相关的),例如

static {

    Logging.initialise();
}

static ByteBufAllocator alloc = new UnpooledByteBufAllocator(true);

如果它是一个通用的实用程序类,您不想在初始化稍后触及并实现编程日志记录,您可能可以设置一个附加程序:

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,请不要做任何事情,因为在这种情况下可以安全地假设有人在其他地方配置了它。

于 2016-09-20T13:08:22.590 回答
1

我在这个问题中找到了我的问题的解决方案:Where to place log4j.xml。如果您使用“-Dlog4j.debug”作为构建 Web 应用程序的参数,它会向您显示使用了哪些附加程序。

我的问题是正确找到了 log4j.xml,但版本不正确。(缺少正确的附加程序)。通过将附加程序添加到 log4j 使用的版本,它可以工作。

我的 Appender 看起来像

<category name="io.netty">
    <priority value="warn"/>
    <appender-ref ref="Console"/>
</category>
于 2013-07-15T17:48:45.733 回答