Java 是否有一种简单的方法为每个类创建一个记录器实例?
我现在使用静态方法进行日志记录(因为我发现在Android中登录非常容易),但现在我需要为不同的类配置不同的appender,所以静态日志记录方法存在问题 我读到了,我注意到是时候改变日志策略了,所以我需要下面的代码给我的类,它需要一个特殊的日志记录器Java 是否有一种简单的方法为每个类创建一个记录器实例?,java,spring,logging,dependency-injection,log4j,Java,Spring,Logging,Dependency Injection,Log4j,我现在使用静态方法进行日志记录(因为我发现在Android中登录非常容易),但现在我需要为不同的类配置不同的appender,所以静态日志记录方法存在问题 我读到了,我注意到是时候改变日志策略了,所以我需要下面的代码给我的类,它需要一个特殊的日志记录器 private static final Logger logger = Logger.getLogger(XXXX.class); 我觉得既然这是一项重复的工作,那么我们有没有办法避免在每个类中添加重复的代码,或者只编写更少的代码。AOP
private static final Logger logger = Logger.getLogger(XXXX.class);
我觉得既然这是一项重复的工作,那么我们有没有办法避免在每个类中添加重复的代码,或者只编写更少的代码。AOP或依赖注入能做这样的工作吗
我正在使用log4j和Spring,但是任何其他的方法都将非常感谢 是的,你可以
- 创建自定义注释,比如@Logger
@Retention(RUNTIME)//will be used at runtime, so retain till runtime @Target(FIELD)//field level annotation public @interface Logger { }
- 在Spring注入的bean中,将Logger字段注释为@Logger
在这里你们可以使用slf4j记录器,但你们可以直接使用log4j等。看看我是如何在这里注释记录器的。这在Spring创建的bean中@Logger private Logger logger;
@Logger
private Logger logger;
public class LoggerInjector implements BeanPostProcessor {
/**
* Return the bean itself.
*/
public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
return bean;
}
/**
* For all beans before initialization, inject the logger using slf4j.
* @param bean
* @param beanName
* @return returns same bean by injecting logger.
*/
public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {
ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
ReflectionUtils.makeAccessible(field);
if (field.getAnnotation(Logger.class) != null) {
if (field.get(bean) == null) {
final Logger logger = LoggerFactory.getLogger(bean.getClass());
field.set(bean, logger);
}
}
}
});
return bean;
}
}
<bean id="loggerInjector"
class="com.mypackage.LoggerInjector"/>
Logger logger = LoggerFactory.getLogger(LoginAction.class);
您可以尝试使用Lombok项目。您只需要将lombok库添加到类路径中,当然您也需要log4j库。并在类级别使用
@Slf4j
注释,那么您应该能够像这样编写日志消息log.info(“message”)
而不创建静态记录器实例
关于这里的更多信息可以使用工厂方法为您需要的每个记录器在您的上下文中添加记录器bean(尽管这不是通常的方法):
@Autowired
private Logger logger;