2010-01-31 2 views
6

J'essaie d'utiliser Log4j dans le cadre de Spring, autant que je comprends par l'utilisation d'un bean approprié le système est censé mapper une instance de singleton accessible dans le code tout en traçant la profondeur de l'enregistrement automatique de la classeUtilisation correcte de LOG4J dans Spring Framework Via DI

similaires à l'utilisation normale de Log4J comme dans

Logger log = Logger.getLogger(getClass());

J'utilise la définition de fèves de printemps suivant

<bean id="log4jInitialization" 
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetClass" 
     value="org.springframework.util.Log4jConfigurer" /> 
    <property name="targetMethod" value="initLogging" /> 
    <property name="arguments"> 
     <list> 
      <value>conf\log4j.xml</value> 
     </list> 
    </property> 
</bean> 

Mais je suis incapable de mapper ce haricot à un membre spécifique dans une classe donnée je ne suis pas en mesure de l'utiliser par @Autowired

S'il vous plaît laissez-moi savoir s'il y a des meilleures façons d'intégrer log4j et Spring

Meilleures salutations

Mark

Répondre

6

La réponse courte à votre question est que log4j n'est pas DI amicale.

La méthode Log4jConfigurer.initLogging() a une valeur de retour vide, donc il n'y a rien à injecter. L'idée est que vous appelez cette méthode, qui initialise log4j, puis vous utilisez l'API Log4j comme d'habitude (en utilisant Logger.getLogger(getClass())).

En règle générale, vous ne configurez pas Log4jConfigurer en tant que bean Spring, mais plus généralement vous l'appelez directement à partir de votre propre code au démarrage de l'application. S'il s'agit d'une application Web, Spring propose des alternatives à Log4jConfigurer mieux adaptées à cet environnement (Log4jWebConfigurer, Log4jConfigListener). Par ailleurs, il y a 2 ans, j'ai déposé un feature request pour permettre aux enregistreurs d'être autowired, et il a finalement été marqué comme correctif pour Spring 3.1. Horray.

+0

Merci. J'espère que votre suggestion est mise en œuvre dans un proche avenir. Par la façon dont j'ai vu log5j trouvé un système pour exécuter automatiquement "Logger.getLogger (getClass())" espoir Spring Community trouver un moyen similaire mais meilleur - Log5j a fait des choses dangereuses pour y parvenir – Mark