[JAVA] Inject Logger au printemps

introduction

Lors de la sortie de Log en Java, utilisez des bibliothèques telles que Log4j et Logback, ou utilisez java.util.logging. La plupart des bibliothèques et API obtiennent et génèrent des instances de Logger comme suit.

Logger logger = Logger.getLogger(Hoge.class);

Les écrire dans chaque classe est un problème. Trouvons un moyen plus simple d'écrire avec Spring.

Ancienne histoire

C'est presque une introduction à la mise en œuvre de ce site. http://memorynotfound.com/spring-inject-logger-annotation-example/

Je vous remercie.

Injection de l'enregistreur par ressort

Si vous utilisez Spring, vous pouvez injecter Logger dans le fichier annoté comme suit:

    @Log
    private static Logger logger;

La quantité de description est petite, mais il n'est pas nécessaire de spécifier la classe de l'argument, vous pouvez donc éliminer l'erreur de Logger (ce qui devrait parfois être fait par copie).

Je vais vous expliquer comment le mettre en œuvre.

Annotation du journal

Créez une annotation de journal comme indiqué ci-dessous.

Log.java


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

Puisqu'il est référencé à l'exécution, il s'agit de «@Retention (RUNTIME)», et comme la cible est un champ, c'est «@Target (FIELD)».

LogInjector

En utilisant Spring, écrivez le code pour injecter le Logger dans le champ avec l'annotation @ Log créée précédemment.

Créez une implémentation BeanPostProcessor pour Spring comme indiqué ci-dessous et créez-y un Logger.

@Component
public class LogInjector implements BeanPostProcessor {

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

    @Override
    public Object postProcessBeforeInitialization(final Object bean, String name) throws BeansException {
        ReflectionUtils.doWithFields(bean.getClass(), new ReflectionUtils.FieldCallback() {
            public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
                // make the field accessible if defined private
                ReflectionUtils.makeAccessible(field);
                if (field.getAnnotation(Log.class) != null) {
                    Logger log = Logger.getLogger(bean.getClass());
                    field.set(bean, log);
                }
            }
        });
        return bean;
    }

}

comment utiliser

Vous êtes maintenant prêt. Après cela, vous pouvez l'utiliser en suivant les étapes ci-dessous.

Désormais, vous n'avez plus besoin de faire getLogger à chaque fois.

Recommended Posts

Inject Logger au printemps
Utilisez Interceptor au printemps
Microservices dans Spring Cloud
Obtenez des cookies au printemps
Définir le paramètre contextuel dans Spring Boot
Multi-projets Spring Boot 2 avec Gradle
Erreur de connexion à la base de données Spring
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Étape de boucle avec Spring Batch
Comment utiliser Lombok au printemps
Chaîne d'appels depuis la chaîne dans l'intégration Spring
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
Environnement Java Spring dans vs Code
Écrire du code de test avec Spring Boot
J'ai participé au JJUG CCC 2019 Spring
Implémenter reCAPTCHA v3 dans Java / Spring
Stocker les informations de session dans la base de données avec Spring Session
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Le traitement des événements est effectué au printemps.
Implémenter l'application Spring Boot dans Gradle
Comment utiliser Thymeleaf avec Spring Boot
Spring Autowired est écrit dans le constructeur
Lancer un (ancien) projet Spring Boot avec IntelliJ
Convertir les paramètres de demande en Enum au printemps
Créer une image Spring Boot + Docker avec Gradle
Priorité d'accès aux fichiers statiques dans Spring Boot
Comment inclure Spring Tool dans Eclipse 4.6.3?
Existe en utilisant la spécification dans Spring Data JPA
Sortie du journal Spring Boot au format json
Mémorandum de téléchargement de fichier local avec Spring Boot
Gérer les variables d'environnement système dans Spring application.properties
Créer un projet Java Spring Boot avec IntelliJ
Desserrer la vérification de la syntaxe de Thymeleaf dans Spring Boot
Erreur de mise en œuvre lors de la mise en œuvre de la validation Spring
Exécuteurs de tâches séparés utilisés par @Async au printemps
[Entraine toi! ] Affichez Hello World avec Spring Boot
Fonctionnement du servlet Dispatcher dans Spring MVC
Utiliser la méthode de requête DynamoDB avec Spring Boot
Cache de support nul dans Spring Data Redis
Pour écrire des données de réponse directement dans Spring
Changements majeurs dans la fonctionnalité de base de Spring Framework 5.0
J'étais accro au @Transactional de Spring
Changement de beans avec annotation de profil dans Spring
DI SessionScope Bean dans le filtre Spring Boot 2
[Java] [Spring] Tester le comportement de l'enregistreur
[* Java *] J'ai participé au JJUG CCC 2019 Spring
Problème de configuration Maven avec Spring pom.xml dans Eclipse
Modifier le délai d'expiration de la session dans Spring Boot
Bean de sortie au format JSON au printemps