2010-01-31 10 views
6

Estoy tratando de usar Log4j como parte de Spring Framework, por lo que entiendo mediante el uso de un bean apropiado se supone que el sistema mapea una instancia singleton accesible en el código mientras que el mapeo de la profundidad de registro de forma automática a la claseUso correcto de LOG4J en Spring Framework Via DI

similar al uso normal de Log4J como en

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

i estado usando la definición de frijol primavera siguiente

<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> 

Pero soy incapaz de asignar este grano a un miembro específico de una clase dada ni soy capaz de utilizarlo a través @autowired

Por favor, hágamelo saber si hay formas mejores para integrar log4j y primavera

Saludos

Marcos

Respuesta

6

La respuesta corta a su pregunta es que no es log4j DI amigable.

El método Log4jConfigurer.initLogging() tiene un valor de retorno nulo, por lo que no hay nada que inyectar. La idea es que llame a ese método, que inicia log4j, y luego usa la API Log4j como de costumbre (usando Logger.getLogger(getClass())).

Sin embargo, generalmente no configuraría Log4jConfigurer como Spring Bean, pero más habitualmente lo invocaría directamente desde su propio código durante el inicio de la aplicación.

Si se trata de una aplicación web, Spring proporciona alternativas a Log4jConfigurer que se adaptan mejor a ese entorno (Log4jWebConfigurer, Log4jConfigListener).

Por cierto, hace 2 años presenté feature request para permitir que los registradores se auto conectaran, y finalmente se ha marcado como solución para Spring 3.1. Horray.

+0

Gracias. Espero que su sugerencia se implemente en un futuro cercano. Por cierto, vi que log5j encontró un sistema para ejecutar automáticamente "Logger.getLogger (getClass())" espero que Spring Community encuentre una forma similar pero mejor: Log5j hizo algunas cosas peligrosas para lograr esto. – Mark