2012-11-05 69 views
1

我将如何处理使用logback工作的Jersey LoggingFilter?我看到这个帖子:Jersey服务器日志记录/ w Logback

How to get jersey logs at server?

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

请注意,我用的弹簧3依赖注入,但我创造记录仪每类代码:

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

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

我的web容器是Tomcat 7.0.12。

回答

2

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

+0

因此,我只是将'handlers = org.slf4j.bridge.SLF4JBridgeHandler'添加到我的类路径中的'logging.properties'文件中? – thatidiotguy

+0

是的。或者通过编程方式在初始化时调用SLF4JBridgeHandler.install() – yossis

+1

因此,文档中提到“一旦安装了SLF4JBridgeHandler,j.u.l.记录器的记录将被引导至SLF4J”。这是什么意思?我正在使用SLF4J的logback,并将我的日志记录重定向到多个文件。我需要不同的配置选项来捕捉这个吗?我想我在问SLF4J将如何处理这些信息? – thatidiotguy

1

我试着用Jersey-Spring4和logback,并且无法通过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; 
} 

什么登录访问控制台。可悲的是,在日志被记录到logback-logger的时候,刚刚被吞下了,所以删除了ConsoleHandler红色在控制台上的日志语句给了我暗示,这可能是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似乎是重要组成部分。

最后,我不知道到底出错了,但这是我猜测的结果,它的工作原理。如果这有助于任何人,我很高兴。