log4j-jul-2.1和Glassfish 3.1.2用法

时间:2015-01-14 09:20:58

标签: glassfish log4j

我正在尝试使用log4提供的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参数提供)来解决这个问题,但这很糟糕。有没有其他/更好看的方法来实现这一目标?简单地将它放入服务器主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$1.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$1.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)

1 个答案:

答案 0 :(得分:0)

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

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

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