Quarkus CDI中自定义Logger注入的日志类别名称配置问题
解决JBoss Logger自定义日志类显示注入目标类名的问题
问题分析
当前自定义LogImpl中使用的JBoss Logger是基于LogImpl.class创建的,导致日志输出的记录器名称固定为LogImpl。要改为注入目标的类名(如示例中的MyService),需要在注入时动态获取目标类的上下文信息,生成对应类的Logger实例。
解决方案
利用CDI的InjectionPoint获取注入场景的上下文,动态生成对应目标类的JBoss Logger实例。
方案一:直接在LogImpl中注入InjectionPoint
修改LogImpl的构造方法,注入InjectionPoint并从中提取注入目标类,以此创建对应Logger:
@Dependent class LogImpl implements Log { private final Logger sink; @Inject public LogImpl(InjectionPoint injectionPoint) { // 获取注入Log的目标类 Class<?> targetClass = injectionPoint.getMember().getDeclaringClass(); this.sink = Logger.getLogger(targetClass); } // 实现Log接口的日志方法,转发给sink @Override public void debug(String message) { sink.debug(message); } @Override public void info(String message) { sink.info(message); } // 其他日志方法(warn/error等)同理实现 }
方案二:使用CDI生产者方法
通过生产者方法统一创建Log实例,便于集中管理日志对象的生成逻辑:
// 日志生产者类 public class LogProducer { @Produces @Dependent public Log produceLog(InjectionPoint injectionPoint) { Class<?> targetClass = injectionPoint.getMember().getDeclaringClass(); Logger jbossLogger = Logger.getLogger(targetClass); return new LogImpl(jbossLogger); } } // 修改LogImpl构造方法,直接接收Logger参数 @Dependent class LogImpl implements Log { private final Logger sink; public LogImpl(Logger sink) { this.sink = sink; } // 实现Log接口的日志方法... }
关键说明
@Dependent作用域确保每个注入点都会生成独立的LogImpl实例,对应各自目标类的Logger。InjectionPoint.getMember().getDeclaringClass()能准确获取到注入Log的类(如MyService),以此创建的JBoss Logger会自动使用该类名作为记录器名称。
内容的提问来源于stack exchange,提问作者Keerthi
相关产品推荐
相关产品推荐

