java – 有没有一种简单的方法为每个类创建一个记录器实例?

我现在使用静态方法来记录(因为我发现很容易登录Android),但是现在我需要为不同的类配置不同的appender,所以我遇到了静态日志记录方法的问题.

我读了Log4J: Strategies for creating Logger instances,我注意到我现在是时候更改日志记录策略了,所以我需要以下代码到我的类,需要一个特殊的记录器.

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.

@Logger
private Logger logger;

在这里你可以使用slf4j logger但是你可以直接使用log4j等.看看我如何在这里注释logger.这是由Spring创建的bean内部.
>使用名为BeanPostProcessor的Spring生命周期接口和使用reflection utils类的方法postProcessBeforeInitialization来注入记录器.

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;
}
}

>完成后,让Spring知道您有一个记录器注入器,如:

<bean id="loggerInjector" 
    class="com.mypackage.LoggerInjector"/>

转载注明原文:java – 有没有一种简单的方法为每个类创建一个记录器实例? - 代码日志