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

如何结合调用者类使用Logger提升性能?解析自定义MyLogger类静态成员问题

关于自定义MyLogger类的疑问解答

一、多次创建对象时static Logger成员的问题

你代码里的static Logger是类级别的共享变量,所有MyLogger实例都会共用这一个对象,这会引发严重问题:

  • 每次创建新的MyLogger实例(不管用哪个构造方法),都会把这个static变量覆盖成新的Logger实例。比如先创建对应ServiceA的MyLogger,再创建对应ServiceB的,那之前的MyLogger实例里的logger也会变成ServiceB的那个。
  • 完全违背了你给不同类/名称创建专属Logger的初衷,最后所有日志都会打上最后一次创建的Logger的标识,根本没法区分日志来源。

二、提升日志记录性能的优化建议

1. 先修复static成员的bug

把static修饰符去掉,让每个MyLogger实例持有自己独立的Logger,同时用final保证不可变:

class MyLogger {
    private final Logger logger;

    public MyLogger(Class cls) {
        logger = Logger.getLogger(cls.getName());
    }

    public MyLogger(String name) {
        logger = Logger.getLogger(name);
    }

    // 封装常用的日志方法,比如info、debug
    public void info(String message) {
        logger.info(message);
    }
}

2. 复用Logger实例

Logger.getLogger()方法内部会缓存实例,同一个名称/类对应的Logger只会创建一次。建议在业务类里把MyLogger定义为static成员,只初始化一次,避免频繁创建MyLogger对象的开销:

public class ServiceA {
    private static final MyLogger logger = new MyLogger(ServiceA.class);

    public void doBusiness() {
        logger.info("执行业务操作");
    }
}

3. 前置日志级别判断

在输出日志前先判断当前级别是否开启,避免不必要的字符串拼接、对象序列化等开销:

public void debug(String message) {
    if (logger.isDebugEnabled()) {
        logger.debug("调试信息:" + message);
    }
}

如果用SLF4J兼容的日志框架(比如Logback),可以直接用占位符写法,框架会自动做级别判断,代码更简洁:

logger.debug("用户{}完成了订单支付", userId);

4. 用异步日志减少阻塞

高并发场景下,把日志写入改成异步模式(比如Logback的AsyncAppender),让日志操作在后台线程执行,不会阻塞业务逻辑的处理,大幅提升性能。

内容的提问来源于stack exchange,提问作者Spring Boot Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:05:27