动态登录 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 在某些项目中内部使用
目前我有一个 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 在某些项目中内部使用