2012-04-07 82 views
4

我使用logback记录Java Web服务应用程序,使用嵌入式Jetty。日志记录的工作原理基于logback.xml文件...除了一些源自Java的日志以外,所有日志都显示在stderr的jsvc输出中。我是否可以控制jsvc stderr输出中显示的java日志的日志格式?

我想专门查看我所有带有毫秒时间戳的Java生成日志,以匹配其他日志,而显示在jsvc stderr输出中的日志只有第二个日志。

jsvc stdout日志主要是从泽西岛生成的,我看到我自己的代码被引用,因为对象注册了Guice,这让我希望它可以通过logback进行控制。我不明白是什么导致这些日志显示在jsvc的stderr输出中,而不是在logback catchall中。有没有人在使用jsvc时在代码或配置中解决了类似的问题?

回答

2

该解决方案需要在几个地方进行更改,主要是slf4j配置问题。我的应用程序有很多依赖项,并且它们引入了各种日志记录实现。 Slf4j被设计成将它们集中在一起,而且这个过程通常只是一个简单的jar插件,但java.util.logging需要更多的努力。

slf4j Bridging Legacy APIs页面描述了(主要)如何连接Jersey引入的JUL依赖关系。我已经包含了jul-to-slf4j.jar,但它没有正确连接。我需要在我的应用程序的初始化中执行SLF4JBridgeHandler.install()。此外,该页面提醒的负面影响性能,除非我也包括在我的logback.xml文件中的以下内容:

<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
    <resetJUL>true</resetJUL> 
</contextListener> 

这让我最的方式存在,但出台日志events--一个去重复slf4j和另一个继续stderr。谷歌指引我到克劳斯尼尔森的博客文章“Bridging java.util.logging to SLF4J”。这包含的代码有帮助的片段:

// Jersey uses java.util.logging - bridge to slf4 
java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger(""); 
Handler[] handlers = rootLogger.getHandlers(); 
for (int i = 0; i < handlers.length; i++) { 
    rootLogger.removeHandler(handlers[i]); 
} 
SLF4JBridgeHandler.install(); 

有了到位,现在的是显示在我的jsvc stderr输出高达泽西日志显示了我的日志的其余部分,很好地格式化,作为导演的logback .XML。

1

据我所知,jsvc是一个用C编写的管理Java应用程序的守护进程。它本身并没有真正运行在Java本身,它的日志记录为stdoutstderr。您可以将jsvc输出重定向到named pipes,并让某些进程读取它们并为您提供毫秒时间戳。你需要付出多少努力才能投入解决方案。

+0

你明白jsvc是什么。有问题的错误信息由Jersey从我自己的应用程序生成并发送到stderr。我认为jsvc捕捉stderr并将输出引导到一个文件。我正在寻找一个解决方案,它会在jsvc达到之前拦截stderr日志输出。 – phatfingers 2012-04-17 15:18:28

+0

我已经更新了这个问题,以更清楚地反映我关心的是从Java内部生成的日志数据,但是显示在jsvc stderr输出中。 – phatfingers 2012-04-17 17:33:52

+1

@phatfingers,你在哪里放logback.xml?如果你在你的webapp的WEB-INF/classes文件夹中有它,那么Jersey显然不会将它用于自己的日志记录。您需要通过将logging.xml [放入全局类路径](http://logback.qos.ch/faq.html#configFileLocation)来设置默认日志记录。 – 2012-04-17 23:57:25

0

根据客户端或容器Filter javadoc,Jersey使用JDK Logging API在默认情况下生成其日志行为System.out

因此,您必须参考Java Logging guide来设置LogManager,以便按级别或级别过滤它的过滤器,或者将来自System.out的日志行转移(或复制)到您自己的文件。使用slf4j自己的代码

,您必须配置的logback由FileAppender更换ConsoleAppender

+0

我使用slf4j将日志输出绑定到logback。有问题的数据显示在stderr中。 – phatfingers 2012-04-18 06:32:20

+1

正如你所说你想要管理Java进程中的所有日志行,你需要Jersey输出来转移,并且你拥有slf4j/logback的代码......所以有两个任务要做。 – 2012-04-18 06:49:07

+0

请提供您的logback XML配置,可能问题在那里。 – 2012-04-18 06:52:53