在 Java 里,Logger 本身不支持“继承”来扩展功能,因为 java.util.logging.Logger(以及 Log4j / SLF4J 的 Logger)通常是通过工厂方法创建的最终类或接口,不是用来被你 extends 的。
不过,根据你的真正需求,一般有 4 种“继承/扩展 Logger”的方式,下面按常见程度说明。
// 错误示例
public class MyLogger extends Logger { // 通常不行
}
原因:
java.util.logging.Logger 构造方法是 protected,且由 LogManager 管理Logger 是接口或 final 类组合优于继承
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");
✅ 优点:
如果你用的是 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());
java.util.logging.Logger 有名称层级继承:
Logger root = Logger.getLogger("com");
Logger sub = Logger.getLogger("com.example");
特性:
sub 自动继承 root 的 Level 和 Handlerpublic class BizLogger {
private final Logger log;
public BizLogger(Class<?> clazz) {
log = LoggerFactory.getLogger(clazz);
}
public void audit(String msg) {
log.info("[AUDIT] {}", msg);
}
}
✅ 唯一可行方案(JUL):
public class MyLogger extends Logger {
protected MyLogger(String name, String resourceBundleName) {
super(name, resourceBundleName);
}
}
⚠️ 但:
LogManager| 目的 | 推荐方式 |
|---|---|
| 增加日志方法 | 包装 Logger |
| 修改日志输出 | 继承 Handler |
| 统一前缀/上下文 | 包装类 |
| 日志分级管理 | Logger 命名继承 |
如果你能告诉我:
我可以直接给你最合适的代码模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。