Jersey服务器日志记录/ w Logback

时间:2012-11-05 21:16:45

标签: java tomcat logging jersey logback

我如何让Jersey LoggingFilter使用logback?我看到这篇文章:

How to get jersey logs at server?

但不幸的是它依赖于java.util.Logger。在web.xml配置方面,我不是非常精通,所以我不知道如何提供init-param个不同的记录器。

请注意,我使用Spring 3进行依赖注入,但是每个类使用代码创建记录器:

Logger logger = LoggerFactory.getLogger(MyClass.class);

希望这是足够的信息。如果没有,请告诉我。

我的网站容器是Tomcat 7.0.12。

3 个答案:

答案 0 :(得分:2)

您可以使用jul-to-slf4j网桥将java.util.Logger电话桥接到Logback。 安装完成后,您可以使用logback.xml控制Jersey日志记录(以及任何其他JUL)。

答案 1 :(得分:2)

我尝试使用Jersey-Spring4进行回溯,但无法通过LoggingFeature将访问日志重定向到我的logback-logger。 logback-logger配置为<logger name="org.glassfish.jersey" level="INFO"/>,我认为这应该可以解决问题。

在我得知泽西岛正在使用JUL之后,我很伤心几分钟并继续使用org.slf4j:jul-to-slf4j。 为了使它工作,我不得不

private void registerLogback(final ServletContext servletContext) {
    servletContext.addListener(new LogbackConfigListener());

    //this is only necessary if you externalise logback.xml from resources     
    try { LogbackConfigurer.initLogging(servletContext.getRealPath("/WEB-INF/logback.xml")); }
    catch (FileNotFoundException | JoranException e) { e.printStackTrace(); }

    LogManager.getLogManager().reset();
    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();
}

在我的WebApplicationInitializer.onStartup(ServletContext servletContext)

我的ResourceConfig看起来像

register(new LoggingFeature(createLogger(), Level.ALL, LoggingFeature.DEFAULT_VERBOSITY, 0)); 

private Logger createLogger() {
    final ConsoleHandler consoleHandler = new ConsoleHandler();
    consoleHandler.setLevel(Level.ALL);

    final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
    logger.setLevel(Level.ALL);
    logger.addHandler(consoleHandler);

    return logger;
}

对控制台的记录访问权限。遗憾地删除ConsoleHandler并没有记录到记录到logback-logger的日志中,只是被吞下了。 但是控制台上的 red 日志语句向我提示这可能是STDERR,尽管它们是INFO

最后LoggingFeature not logging correctly based on configuration on constructor给了我一个缺失的部分。

我的最终和工作ResourceConfig最终成为

register(new LoggingFeature(Logger.getLogger(LoggingFeature.DEFAULT_LOGGER_NAME), Level.INFO, LoggingFeature.DEFAULT_VERBOSITY, 0));

LoggingFeature.DEFAULT_LOGGER_NAMELevel.INFO似乎是关键部分。

最后我不知道到底出了什么问题,但这是我猜测的结果,而且确实有效。如果这对任何人都有帮助,我很高兴。

答案 2 :(得分:0)

来自Slf4jLogger包的

org.apache.cxf:cxf-core 是另一种选择。它实现java.util.logging.Logger并将cals委托给slf4J。

泽西服务器:

ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
config.register(
    new Slf4jLogger(this.getClass().getName(), null));

泽西岛客户:

ClientBuilder
    .newClient()
    .register(
        new LoggingFeature(
                new Slf4jLogger(this.getClass().getName(), null)));