You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:15:43