log4j-jul-2.1 和 Glassfish 3.1.2 用法

log4j-jul-2.1 and Glassfish 3.1.2 usage

我正在尝试使用 birdge 提供的 log4j-jul-2.1 将 Java Util Logging 日志重定向到 Log4j 2.1,但遇到了类路径问题。我在域 lib 目录中拥有所有 log4j jar,并使用了 log4j 文档中提到的以下 JVM 参数:

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

问题是log4j提供的桥接LogManager在启动期间在Glassfish AppClassLoader中不可用,导致以下异常。我可以通过修改服务器主类路径(由 -cp 参数提供)来解决这个问题,但这很糟糕。有什么 other/better 的方法可以实现吗?简单地将它放入服务器主 lib 目录也不起作用,因为它又不是 AppClassLoader。

Could not load Logmanager "org.apache.logging.log4j.jul.LogManager"
    java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager
            at java.net.URLClassLoader.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            at java.util.logging.LogManager.run(LogManager.java:167)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.util.logging.LogManager.<clinit>(LogManager.java:157)
            at java.util.logging.Logger.getLogger(Logger.java:287)
            at com.sun.enterprise.glassfish.bootstrap.ASMainHelper.<clinit>(ASMainHelper.java:67)
            at com.sun.enterprise.glassfish.bootstrap.ASMain.main(ASMain.java:54)

我最终决定使用 SLF4J 及其 SLF4JBridgeHandler 来处理 Java Util Logging 调用。它的主要好处是它可以在稍后加载所有 类 并且在所有必需的静态初始化之后初始化。

    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();

我也切换到 Logback 作为后端,因为这个解决方案 Log4j 遇到禁用 JUL 记录器的性能问题。