2009-11-13 18 views
3

Mon lead de construction actuel a une bonne idée en théorie - construire un appender Log4J personnalisé qui prend en charge les beans gérés par Spring et les utilise pour consigner les erreurs dans d'autres sources que le fichier journal standard. Cependant, en dehors de la création d'un singleton initialisé au démarrage avec le contexte de l'application (code en un instant), je ne peux pas penser à d'autres options de récupération d'un bean géré Spring dans un appender Log4J.Quelles sont les options disponibles pour récupérer les beans gérés par Spring dans un Log4J Appender dans une application Web gérée par Spring?

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 les haricots au printemps par injection de dépendance - les références de haricots ne changeront jamais, peu importe combien de appenders sont initialisés. Des idées?

Répondre

6

Vous allez avoir un problème de boostrap puisque log4j doit être initialisé avant Printemps. Que vous utilisiez un custom configuration ou l'initialiseur standard de Log4j, il doit être activé avant le contexte de l'application. Maintenant, vous pourriez théoriquement vous initialiser paresseusement vos appenders personnalisés (soit par l'approche que vous avez suggérée plus haut, soit en faisant des appenders eux-mêmes des "semi" singletons - par exemple, la classe appender a un champ d'instance statique qui est rempli par afterPropertiesSet() méthode, de cette façon vous pouvez créer l'appender lui-même en tant que bean au printemps) mais il semble quelque peu désordonné et incohérent.

Une autre approche consiste à reconfigurer dynamiquement Log4j une fois que le contexte Spring est initialisé; par exemple. écrivez un listener pour attraper un ContextStartedEvent, obtenez tous les beans de type Appender du contexte et ajoutez-les à la configuration de Log4j. Cela vous permettra également de créer vos appenders comme des haricots, mais évitez un peu le désordre singleton.

+0

Oooh ... J'aime l'idée d'auditeur. Je vais transmettre cela. J'attendrai des réponses supplémentaires, cependant, car vous ne semblez pas faire mal pour le représentant :) +1. – MetroidFan2002

+0

Hey, hé - pour citer à tort Rich Texan de Simpsons (http://www.imdb.com/title/tt1023430/quotes) "J'ai travaillé dur pour mal-obtenir ce représentant" :-) – ChssPly76

+0

Bonnes choses. Apparemment, nous avons déjà une implémentation de BeanFactoryPostProcessor qui permet de définir un tableau d'appenders supplémentaire, donc nous allons l'utiliser, mais comme personne n'a répondu à la question et cela correspond certainement, vous obtenez plus de rep :) – MetroidFan2002