Il nous faut donc une instance du logger dans chaque classe comme dans le code suivant :
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UserService { private static Logger log = LoggerFactory.getLogger(UserService.class); public void create(String nom) { logger.debug("User with name " + args + " is created"); } }Il serait interessant de pouvoir injecter une instance du logger avec Spring en utilisant les annotations.
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @Documented public @interface Log { }Puis on définit un Spring bean processor
import java.lang.reflect.Field; import org.slf4j.Logger; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils.FieldCallback; import org.slf4j.LoggerFactory; public class LoggerInjector implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() { @Override public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { ReflectionUtils.makeAccessible(field); if (field.getAnnotation(Log.class) != null) { Logger log = LoggerFactory.getLogger(bean.getClass()); field.set(bean, log); } } }); return bean; } }Ansi nous pouvons injecter un logger en utilisant l'annotation @Log
@Service public class UserService { @Log Logger log; public void create(String nom) { log.debug("User with name " + args + " is created"); } }Dans le fichier de configuration de Spring nous activons le component-scan en replaçant "le_nom_du_package" par le nom du package ou sont définie les Spring beans (par exemple : com.monapp )
<context:component-scan base-package="le_nom_du_package"/>