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

因此,我尝试添加Log4j JDK Logging Adapter。我在构建路径和Deployment Assembly中添加了必要的JAR(仅缺少log4j-jul,因为我已经有其他的log4j-jars用于其他用途),并在-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager中添加了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中发生的。

在启动的这个阶段是否有办法让罐子知道?

编辑我问了一个后续问题here,并按照那里的建议使用Log4jBridgeHandler而不是换出LogManager

最佳答案

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

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

关于java - WebSphere-无法加载Logmanager“org.apache.logging.log4j.jul.LogManager”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55827925/

10-15 09:08