动态登录 spring 框架

Dynamically logging in spring framework

目前我有一个 spring 引导应用程序,对于每个 class 喜欢 SampleClass 我想要一个日志我需要像这样初始化记录器:

private static Logger log = LoggerFactory.getLogger(SampleClass.class);

这意味着我们需要将class名称静态发送到getLogger方法。 我正在考虑创建一个可记录的接口,每次 class 实现此接口时,它会动态查找 class 名称并使用正确的 class 名称将日志正确写入输出流。 我用谷歌搜索找到了合适的解决方案,但每个示例都在编译时专门发送了 classname。 spring有这个能力吗?

创建一个新的 @Log 注释。

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {}

现在实现 BeanPostProcessor,它为我们提供 postProcessBeforeInitialization 方法,允许我们在初始化之前管理 bean。我们搜索 @Log 注释并使用 LoggerFactory.

注入一个实现
@Component
public class LoggerPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new ReflectionUtils.FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                Logger log = LoggerFactory.getLogger(bean.getClass());
                ReflectionUtils.makeAccessible(field);
                field.set(bean, log);
            }
        }, new ReflectionUtils.FieldFilter() {
            @Override
            public boolean matches(Field field) {
                return field.isAnnotationPresent(Log.class);
            }
        });
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

并在字段级别使用 @Log 注释来描述我们要注入记录器。

@Log
private Logger logger;

我建议在你的项目中使用Lombok @log varient,它会在编译时自动设置

如果您使用的是 slf4j,请使用 @Slf4j

这是最好的方法,甚至 spring 在某些项目中内部使用