温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Logger 怎么继承

发布时间:2026-10-23 15:15:40 来源:亿速云 阅读:83 作者:小樊 栏目:编程语言

在 Java 里,Logger 本身不支持“继承”来扩展功能,因为 java.util.logging.Logger(以及 Log4j / SLF4J 的 Logger)通常是通过工厂方法创建的最终类或接口,不是用来被你 extends 的。

不过,根据你的真正需求,一般有 4 种“继承/扩展 Logger”的方式,下面按常见程度说明。


一、最常见的误解:Logger 不能这样继承 ❌

// 错误示例
public class MyLogger extends Logger { // 通常不行
}

原因:

  • java.util.logging.Logger 构造方法是 protected,且由 LogManager 管理
  • Log4j / SLF4J 的 Logger 是接口或 final 类

二、正确方式 1:包装 Logger(推荐 ✅)

组合优于继承

public class MyLogger {
    private final Logger logger;

    public MyLogger(Class<?> clazz) {
        this.logger = Logger.getLogger(clazz.getName());
    }

    public void info(String msg) {
        logger.info("[自定义前缀] " + msg);
    }
}

使用:

MyLogger log = new MyLogger(this.getClass());
log.info("hello");

✅ 优点:

  • 完全可控
  • 不破坏日志框架
  • 可加字段、上下文、统一格式

三、正确方式 2:继承 Handler(JUL 场景)

如果你用的是 java.util.logging,继承的是 Handler,不是 Logger

public class MyHandler extends Handler {
    @Override
    public void publish(LogRecord record) {
        System.out.println("自定义:" + record.getMessage());
    }

    @Override public void flush() {}
    @Override public void close() {}
}

配置:

logger.addHandler(new MyHandler());

四、正确方式 3:使用 Logger 的“父子关系”(JUL 特性)

java.util.logging.Logger 有名称层级继承:

Logger root = Logger.getLogger("com");
Logger sub  = Logger.getLogger("com.example");

特性:

  • sub 自动继承 root 的 Level 和 Handler
  • 这不是代码继承,而是“日志命名空间继承”

五、正确方式 4:SLF4J + 自定义适配器(企业常用)

public class BizLogger {
    private final Logger log;

    public BizLogger(Class<?> clazz) {
        log = LoggerFactory.getLogger(clazz);
    }

    public void audit(String msg) {
        log.info("[AUDIT] {}", msg);
    }
}

六、如果你真的“必须继承 Logger”

✅ 唯一可行方案(JUL):

public class MyLogger extends Logger {
    protected MyLogger(String name, String resourceBundleName) {
        super(name, resourceBundleName);
    }
}

⚠️ 但:

  • 你必须自己接入 LogManager
  • 极易踩坑
  • 99% 场景不推荐

总结建议 ✅

目的 推荐方式
增加日志方法 包装 Logger
修改日志输出 继承 Handler
统一前缀/上下文 包装类
日志分级管理 Logger 命名继承

如果你能告诉我:

  • 用的是 JUL / Log4j / Logback / SLF4J
  • 想“继承 Logger”是为了什么功能

我可以直接给你最合适的代码模板。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手