Quelles sont les options disponibles pour récupérer les haricots gérés par le printemps dans un appender log4j dans une application Web gérée par le printemps?

StackOverflow https://stackoverflow.com/questions/1730634

Question

Mon lead de construction actuel a une excellente idée en théorie - construire un appender log4j personnalisé qui prend des beans gérés par le ressort et les utilise pour enregistrer les erreurs à diverses autres sources que le simple fichier journal standard. Cependant, à part la création d'un singleton initialisé au démarrage avec le contexte de l'application (code dans un instant), je n'arrive pas à penser à d'autres options pour récupérer un bean géré à ressort dans un appender log4j.

public class SpringSingleton implements ApplicationContextAware {
    private static ApplicationContext context;
    public SpringSingleton() {
        super();
    }
    public static ApplicationContext getContext() {
        return SpringSingleton.context;
    }
    public void setApplicationContext(ApplicationContext context) {
        if(SpringSingleton.context != null) {
            throw new IllegalStateException("Context is already set!");
        }
        SpringSingleton.context = context;
    }
}

Idéalement, ces propriétés pourraient être définies comme des haricots au printemps via l'injection de dépendance - les références de haricots ne changeront jamais, peu importe le nombre d'annexeurs initialisés. Des idées?

Était-ce utile?

La solution

Vous allez avoir un problème Boostrap car Log4j doit être initialisé avant de Le printemps. Si vous utilisez un configuration personnalisée ou l'initialisateur standard de Log4j, il doit être en place avant le contexte de l'application.

Maintenant, vous pouvez en théorie faire de vos annexes personnalisées "paresseusement" s'initialiser (soit via une approche que vous avez suggérée ci-dessus, soit en faisant des annexes eux-mêmes "semi" Singletons - par exemple, la classe d'appenner a un champ d'instance statique qui est peuplé par afterPropertiesSet() méthode; De cette façon, vous pouvez créer l'appender lui-même comme Bean au printemps), mais cela semble quelque peu désordonné et incohérent.

Une autre approche consiste à reconfigurer dynamiquement LOG4J une fois le contexte de ressort initialisé; par exemple écrire un auditeur Pour attraper un ContextStartedEvent, Obtenez tous les haricots de type Appender dans le contexte et ajoutez-les à la configuration log4j. Cela vous permettra également de créer vos annexes en tant que haricots, mais éviter un désordre singleton.

Autres conseils

Un peu tard, mais j'espère que cela pourra aider quelqu'un d'autre. J'ai documenté une solution à ce problème dans la réponse que j'ai fournie dans le lien suivant:

log4j - accéder à Spring Bean à partir de la classe de journalisation

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top