3

我阅读了有关如何将 java.util.logging 日志和 System.(out|err) 输出通过管道传输到 slf4j 的信息:

但它需要在码头启动时执行一些 jar/类和代码。基本上是这样的:

SLF4JBridgeHandler.install() // to pipe j.u.l SysOutOverSLF4J.sendSystemOutAndErrToSLF4J() // to pipe System.(out|err)

我知道如何为码头添加所需的罐子/类(只需将 sysout-over-slf4j.jar 和 jul-to-slf4j.jar 添加到 $JETTY_HOME/lib/ext),但我不知道如何运行服务器启动中的 abobe 代码,以便码头将合并的输出(sysout 和 jul)配置为 slf4j。我可以为每个 webapp 运行该代码,但为了使事情正确,它应该由 jetty 完成,而不是由需要这种行为的每个 webapp 完成。

这应该以不同的方式完成吗?有没有一种非巫毒的方式来做到这一点?

请让你的答案是码头版本> = 8

4

1 回答 1

1

我不知道这是否会奏效,但你试过了吗?

public class MyWebappServlet ... {
  static {
    // to pipe j.u.l
    SLF4JBridgeHandler.install();

    // to pipe System.(out|err)
    SysOutOverSLF4J.sendSystemOutAndErrToSLF4J();
  }
  ...

在你的web.xml

<servlet>
  <servlet-name>MyWebapp</servlet-name>
  <servlet-class>MyWebappServlet</servlet-class>
</servlet>

它可能不会从一开始就拦截所有内容,但是一旦 Jetty 加载您的MyWebappServlet类,日志记录应该被重定向。

否则,您将需要使用这两行自定义您的 Jetty。

更新: 还有另一种方法 - 使用像BCELmain()这样​​的包装器来启动 Jetty,但只有在完成这些日志重定向之后。

在这种情况下,命令行将是这样的:

java my.custom.JavaWrapper org.eclipse.jetty.start.Main [arguments]

如果可以这样做,jetty.sh那么它将适用于该服务器实例中的所有 Web 应用程序。

于 2013-04-17T12:47:35.163 回答