Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以控制jsvc stderr输出中显示的java日志的日志格式?_Java_Logging_Logback_Jsvc - Fatal编程技术网

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

我是否可以控制jsvc stderr输出中显示的java日志的日志格式?,java,logging,logback,jsvc,Java,Logging,Logback,Jsvc,我正在使用logback记录Java web服务应用程序,使用嵌入式Jetty。日志根据logback.xml文件按预期工作。。。除了一些源于Java的日志之外,所有日志都显示在stderr的jsvc输出中 我特别希望看到所有Java生成的日志都有毫秒的时间戳,以匹配其他日志,而jsvc stderr输出中显示的日志只有毫秒 jsvc stdout日志主要是从Jersey生成的,我看到我自己的代码被引用,因为对象是在Guice中注册的,这让我希望可以通过logback来控制它。我不明白是什么原因

我正在使用logback记录Java web服务应用程序,使用嵌入式Jetty。日志根据logback.xml文件按预期工作。。。除了一些源于Java的日志之外,所有日志都显示在stderr的jsvc输出中

我特别希望看到所有Java生成的日志都有毫秒的时间戳,以匹配其他日志,而jsvc stderr输出中显示的日志只有毫秒


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

据我所知,
jsvc
是一个用C编写的守护程序,用于管理Java应用程序。它并不是真正在Java中运行,它的日志记录限制在
stdout
stderr
上。您可以将
jsvc
输出重定向到,让某个进程读取它们,并给出毫秒时间戳。根据客户机或容器的不同,Jersey使用JDK日志API在默认情况下将其日志行生成到
System.out

因此,您必须参考来设置
LogManager
,以便它按类或级别进行筛选,甚至将
System.out
中的日志行转移(或复制)到您自己的文件中


您自己的代码使用
slf4j
,您必须配置logback以用
文件追加器替换
控制台pender

解决方案需要在一些地方进行更改,主要是slf4j配置问题。我的应用程序有许多依赖项,它们引入了各种日志记录实现。Slf4j的设计目的是将它们集中在一起,这个过程通常只是一个简单的jar,但是java.util.logging需要更多的工作

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

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

真的
这让我大部分时间都在那里,但引入了日志事件的重复——一个去了slf4j,另一个继续去了stderr。谷歌让我看了克劳斯·尼尔森博客上的一篇文章。其中包含一段有用的代码:

// 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();
//Jersey使用java.util.logging-bridge连接到slf4
java.util.logging.Logger rootLogger=LogManager.getLogManager().getLogger(“”);
Handler[]handlers=rootLogger.getHandlers();
for(int i=0;i

在这个位置上,jsvc stderr输出中显示的Jersey日志现在与我的其余日志一起显示,按照logback.xml的指示,格式很好。

您正确地理解了jsvc是什么。问题中的错误消息由Jersey从我自己的应用程序生成并发送到stderr。我认为jsvc正在捕获stderr并将输出定向到一个文件。我正在寻找一种在stderr日志输出到达jsvc之前拦截它的解决方案。我已经更新了这个问题,以更清楚地反映出我关心的是从Java内部生成的日志数据,但是这些数据显示在jsvc stderr输出中。@phatfingers,您将logback.xml放在哪里?如果你把它放在webapp的WEB-INF/classes文件夹中,那么Jersey显然不会将它用于自己的日志记录。您需要通过放置logging.xml来设置默认日志记录。@Old_Pro,我使用的是嵌入式Jetty,而不是servlet容器。我开发的所有类都在一个jar文件中,我的外部LIB在一个子文件夹中,jar文件的MANIFEST.MF在类路径变量中引用它们。我的主类是plup.HttpServerMain,logback.xml在HttpServerMain.class文件旁边的jar文件中的同一个“pulp”包中。@Old_Pro,我使用外部世界可读的logback.xml文件的完全限定路径修改了传递给jsvc的-cp参数中的字符串,但仍然没有乐趣。不过,我认为您已经了解了一些东西——webapp上下文是关于logback.xml文件的,但实际上容器的日志记录只看到标准输出。我将对它进行更多的修改,并分享我发现的任何东西。我将使用slf4j将日志输出绑定到logback。正在讨论的数据显示在stderr中。正如您所说,您希望管理Java进程之外的所有日志行,您有Jersey输出要转移,并且您拥有带有slf4j/logback的代码。。。所以有两个任务要做。请提供您的logback XML配置,可能问题就在这里。