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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:35:10