java - 如何整合 java.util.logging、System.(out|err) 和 Jetty 日志记录?

标签 java jetty slf4j logback java.util.logging

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

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

SLF4JBridgeHandler.install()//管道 j.u.l SysOutOverSLF4J.sendSystemOutAndErrToSLF4J()//管道 System.(out|err)

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

这应该以不同的方式完成吗?有没有非伏都教的方法来做到这一点?

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

最佳答案

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

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。

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

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

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

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

关于java - 如何整合 java.util.logging、System.(out|err) 和 Jetty 日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14669416/

相关文章:

java - 为什么我的 "While"循环一直持续下去?

java - ACRA 未通过 HTTPSender 发送

java - 如何使用maven启动和停止jetty

jetty - 如何告诉 Jetty 哪个是默认的 Web 应用程序

grails - 嵌套闭包无法访问私有(private)静态字段

java - Spring 启动 : multiple SLF4J bindings

java - 运行时向线程传递参数

java - JDBI 对象查询

ssl - 支持 SSL 的 Jetty ProxyServlet

spring-boot - ClassNotFoundException : org. slf4j.impl.StaticLoggerBinder