WebSphere - 无法加载 Logmanager“org.apache.logging.log4j.jul.LogManager”

2024-03-22

我有一个运行 Web 应用程序的 WebSphere 应用程序服务器。我从 Eclipse 启动服务器。该应用程序中的主要日志记录框架是 log4j2,但也有一些使用 java.util.logging 的第三方库。我想将这些日志重定向到 log4j2,以便它使用我的过滤器、日志格式等。

因此我尝试添加Log4j JDK 日志适配器 https://logging.apache.org/log4j/2.0/log4j-jul/index.html。我添加了必要的JAR(我只缺少log4j-jul因为我已经将其他 log4j-jar 用于其他目的)到构建路径和部署程序集并添加了行-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager to my jvm.options.

启动后立即出现以下异常:

Could not load Logmanager "org.apache.logging.log4j.jul.LogManager"
java.lang.ClassNotFoundException: org.apache.logging.log4j.jul.LogManager
    at java.net.URLClassLoader.findClass(URLClassLoader.java:609)
    at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:850)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:829)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:329)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:809)
    at java.util.logging.LogManager$1.run(LogManager.java:206)
    at java.util.logging.LogManager$1.run(LogManager.java:192)
    at java.security.AccessController.doPrivileged(AccessController.java:594)
    at java.util.logging.LogManager.<clinit>(LogManager.java:192)
    at java.util.logging.Logger.demandLogger(Logger.java:459)
    at java.util.logging.Logger.getLogger(Logger.java:513)
    at com.sun.jmx.remote.util.ClassLogger.<init>(ClassLogger.java:67)
    at javax.management.NotificationBroadcasterSupport.<clinit>(NotificationBroadcasterSupport.java:376)
    at com.ibm.lang.management.OperatingSystemMXBeanImpl.<init>(OperatingSystemMXBeanImpl.java:38)
    at com.ibm.lang.management.ExtendedOperatingSystem.<clinit>(ExtendedOperatingSystem.java:23)
    at com.ibm.lang.management.RuntimeMXBeanImpl.<clinit>(RuntimeMXBeanImpl.java:29)
    at com.ibm.lang.management.ManagementUtils.getRuntimeBean(ManagementUtils.java:402)
    at java.lang.management.ManagementFactory.getRuntimeMXBean(ManagementFactory.java:393)
    at com.ibm.ws.logging.internal.impl.LogProviderConfigImpl.getLogHeader(LogProviderConfigImpl.java:259)
    at com.ibm.ws.logging.internal.impl.LogProviderConfigImpl.<init>(LogProviderConfigImpl.java:177)
    at com.ibm.ws.logging.internal.impl.LogProviderImpl.configure(LogProviderImpl.java:31)
    at com.ibm.ws.kernel.launch.internal.LauncherDelegateImpl.getLogProviderImpl(LauncherDelegateImpl.java:185)
    at com.ibm.ws.kernel.launch.internal.LauncherDelegateImpl.launchFramework(LauncherDelegateImpl.java:91)
    at com.ibm.ws.kernel.boot.internal.KernelBootstrap.go(KernelBootstrap.java:212)
    at com.ibm.ws.kernel.boot.Launcher.handleActions(Launcher.java:246)
    at com.ibm.ws.kernel.boot.Launcher.createPlatform(Launcher.java:121)
    at com.ibm.ws.kernel.boot.cmdline.EnvCheck.main(EnvCheck.java:59)
    at com.ibm.ws.kernel.boot.cmdline.EnvCheck.main(EnvCheck.java:35)

我不知道这个堆栈跟踪中的大多数类,但对我来说,看起来异常很早就抛出了,可能是在设置 JVM 时,并且我的 .war 文件中打包的 jar 还不知道。

问题是根据上面链接的 log4j 文档,我需要设置系统属性LogManager在第一次调用之前LogManager,这似乎确实发生在NotificationBroadcasterSupport从堆栈跟踪。

有没有办法让jar在启动的这个阶段被人知道?

Edit我问了一个后续问题here https://stackoverflow.com/questions/55832210/log4j-jdk-logging-adapter-apply-logmanager-system-property-late-in-the-startup并按照那里的建议使用Log4jBridgeHandler而不是换掉LogManager.


这里的问题是,不仅仅是您的应用程序使用 java.util.logging (JUL) - 服务器的核心也是如此,并尝试将 JUL 重定向到 Log4J 并使用系统属性(适用于整个JVM),您实际上是在尝试通过 Log4J 设置重定向服务器中的所有日志记录。服务器 messages.log 中的任何内容都将显示在您的日志记录中。

如果您仍然真的想这样做,最简单的解决方案可能是将 log4j-jul jar 放入 JVM 启动类路径中,以便 Java 系统加载程序可以看到它(您可能必须对任何依赖项和配置文件执行相同的操作) )。同样,您将覆盖所有服务器级日志记录,因此我不希望这会是受支持的配置(如果您打开支持案例,他们不会想要查看您的自定义 Log4J 格式的日志)服务器详细信息),但理论上它应该可以正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSphere - 无法加载 Logmanager“org.apache.logging.log4j.jul.LogManager” 的相关文章

随机推荐