WebLogic 14中使用LogManager.getLogger()导致部署报错问题求助
WebLogic 14下Log4j无参
LogManager.getLogger()报错的解决方法 问题重现
以下Spring Controller代码在Apache Tomcat环境运行正常,但部署到WebLogic 14时启动抛出异常:
@Controller public class HomeController { private static final Logger log = LogManager.getLogger(); @GetMapping("/hello") public @ResponseBody String getHello() { DemoClass cls = new DemoClass(); cls.helloworld(); log.info("INFO ====================="); return "Hello2"; } }
报错堆栈:
Caused By: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found. at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:573) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:585) at com.example.demo.controller.HomeController.<clinit>(HomeController.java:12)
使用环境:Java 11、WebLogic 14、Log4j 2.19.0
问题原因
LogManager.getLogger()无参方法依赖解析调用栈自动推断当前类,但WebLogic 14的类加载机制或字节码增强逻辑干扰了Log4j获取调用栈信息的过程,导致无法正确识别日志所属类,最终抛出UnsupportedOperationException。
解决方案
避免依赖自动类推断,直接显式传入当前类对象作为参数调用LogManager.getLogger():
修改后的代码:
@Controller public class HomeController { // 显式传入当前类对象 private static final Logger log = LogManager.getLogger(HomeController.class); @GetMapping("/hello") public @ResponseBody String getHello() { DemoClass cls = new DemoClass(); cls.helloworld(); log.info("INFO ====================="); return "Hello2"; } }
说明
显式指定类对象的方式不依赖调用栈解析,兼容性更强,能同时适配Tomcat、WebLogic等不同应用服务器环境。Log4j的无参getLogger()虽在多数环境下可用,但在类加载机制特殊的服务器中易出现兼容性问题,显式传参是更稳妥的做法。
内容的提问来源于stack exchange,提问作者Aditya Sawant
相关产品推荐
相关产品推荐

