2010-01-31 3 views
6

Ich versuche, Log4j als Teil des Spring Framework, zu verwenden, soweit ich durch die Verwendung einer entsprechenden Bohne das System soll eine Singleton Instanz zugänglich zugreifen im Code während der Abbildung die Loggingtiefe automatisch in die KlasseKorrekte Verwendung von LOG4J in Spring Framework über DI

ähnlich wie bei der normalen Nutzung von Log4J wie in

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

ich habe folgende Spring-Bean-Definition wurde mit

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

Aber ich bin nicht in der Lage diese Bohne zu einem bestimmten Element in einer bestimmten Klasse zuordnen noch bin ich in der Lage, es zu benutzen durch @autowired

Bitte lassen Sie mich wissen, wenn es bessere Möglichkeiten gibt, zu integrieren log4j und Spring

Mit freundlichen Grüßen

Mark

Antwort

6

Die kurze Antwort auf Ihre Frage ist, dass log4j nicht DI freundlich.

Die Log4jConfigurer.initLogging() Methode hat einen ungültigen Rückgabewert, es gibt also nichts zu injizieren. Die Idee ist, dass Sie diese Methode aufrufen, die log4j bootstrappt, und dann verwenden Sie wie gewohnt die Log4j-API (mit Logger.getLogger(getClass())).

Sie würden Log4jConfigurer normalerweise nicht als Spring-Bean konfigurieren, aber normalerweise würden Sie es direkt aus Ihrem eigenen Code beim Start der Anwendung aufrufen.

Wenn dies eine Webanwendung ist, bietet Spring Alternativen zu Log4jConfigurer, die für diese Umgebung besser geeignet sind (, Log4jConfigListener).

Übrigens, ich habe vor 2 Jahren eine feature request archiviert, damit Logger autowired werden können, und es wurde schließlich als Fix für Spring 3.1 markiert. Horray.

+0

Danke. Ich hoffe, dass Ihr Vorschlag in naher Zukunft umgesetzt wird. Übrigens habe ich gesehen, dass log5j ein System gefunden hat, um automatisch "Logger.getLogger (getClass())" auszuführen. Hoffe, dass Spring Community einen ähnlichen, aber besseren Weg findet - Log5j hat einige gefährliche Dinge getan, um dies zu erreichen – Mark