我有一个运行WebApp的WebSphere Application Server。我从Eclipse启动服务器。该应用程序中的主要日志记录框架是log4j2,但是有一些使用java.util.logging的第三方库。我想将这些日志重定向到log4j2,以便它使用我的过滤器,日志格式等。
因此,我尝试添加Log4j JDK Logging Adapter。我在构建路径和Deployment Assembly中添加了必要的JAR(仅缺少log4j-jul
,因为我已经有其他的log4j-jars用于其他用途),并在我的{{1 }}。
启动后立即出现以下异常:
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
我不知道此堆栈跟踪中的大多数类,但对我来说,似乎异常抛出得很早,也许是在设置JVM时抛出的,而且尚不知道打包在我的.war文件中的jar 。
问题是,根据上面链接的log4j文档,我需要在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)
设置系统属性,这实际上确实发生在{{ 1}}从堆栈跟踪。
在启动的这一阶段是否有办法让jar知道?
编辑,我问了一个后续问题here,并按照那里的建议使用LogManager
而不是换掉LogManager
。
答案 0 :(得分:2)
这里的问题是使用java.util.logging(JUL)的不仅是您的应用程序-服务器核心也是如此,并且尝试将JUL重定向到Log4J并使用系统属性强制执行(适用于到整个JVM),您实际上是在尝试通过Log4J设置重定向服务器中的所有日志记录。服务器的messages.log中包含的所有内容都将显示在您的日志中。
如果您仍然真的想要这样做,最简单的解决方案可能是将log4j-jul jar放入JVM启动类路径,因此对于Java系统加载器来说是可见的(您可能必须对任何依赖项执行相同的操作和配置文件)。同样,您将覆盖所有服务器级别的日志记录,因此我不希望这是受支持的配置(如果打开支持案例,他们将不想查看您的自定义Log4J格式的日志以获取服务器详细信息),但从理论上讲应该可以使用。