如何结合调用者类使用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
相关产品推荐
相关产品推荐

