我是否可以控制在jsvc stderr输出中显示的java日志的日志格式?

时间:2012-04-07 01:06:10

标签: java logging logback jsvc

我正在使用logback来使用嵌入式Jetty来记录Java Web服务应用程序。日志记录基于logback.xml文件按预期工作...除了源自Java的一些日志,但在jsvc输出中显示给stderr。

我想特别看到我的所有Java生成的日志都有毫秒的时间戳来匹配我的其他日志,并且在jsvc stderr输出中显示的日志只有第二个。

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

3 个答案:

答案 0 :(得分: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>

这让我大部分都在那里,但引入了日志事件的重复 - 一个去了slf4j而另一个继续stderr。 Google指导我阅读Claus Neilsen博客中的一篇文章“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输出中显示的Jersey日志现在显示我的其余日志,格式正确,按照logback.xml的指示。

答案 1 :(得分:1)

据我了解,jsvc是一个用C编写的守护进程,用于管理Java应用程序。它实际上并不是用Java本身运行的,而且它的日志记录仅限于stdoutstderr。您可以将jsvc输出重定向到named pipes并让某些进程读取它们并为您提供毫秒时间戳。由您决定在解决方案中投入多少精力。

答案 2 :(得分:0)

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

因此,您必须参考Java Logging guide设置LogManager,以便按类或级别过滤,甚至将日志行从System.out转移(或复制)到您的自己的文件。

使用slf4j创建自己的代码,您必须配置回退以ConsoleAppender替换FileAppender