2014-10-22 6 views
6

Was ich will ist, um Frühling Autowire ein Logger zu machen. Also, mit anderen Worten, ich mag diese Funktion haben:Wie injiziere ich einen Logger in ein Feld in der Beispiel-Spring-Boot-Anwendung?

import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class MainController { 

    @Autowired 
    private Logger logger; 

    @RequestMapping("/") 
    public String enterSite(HttpServletResponse response) { 
     logger.info("site entered"); 
     return "welcome"; 
    } 
} 

Gerade jetzt wirft es eine Ausnahme beim Start: „Keine Warte Bean vom Typ [org.slf4j.Logger] für Abhängigkeit gefunden ...“.

Meine pom.xml Abhängigkeiten:

<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.0.M1</version> 
     <relativePath /> <!-- lookup parent from repository --> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-rest</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>jstl</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.1-901.jdbc4</version> 
     </dependency> 
     <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> 
      </dependency> --> 
    </dependencies> 

Ich lese diese

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-logging

Es sagt, wenn Sie eine der Starter Poms verwenden (i do) Logback verwendet wird - aber für die interne protokollieren. Kann es in meinen Klassen autowired werden?

Antwort

8

Obwohl es nicht die übliche Art und Weise ist, dass Sie direkt einen Logger-Bean hinzufügen können in Ihrem Kontext Wiedergabe des klassischen bind:

private final Logger logger = LoggerFactory.getLogger(MainController.class); 

einfach im Frühjahr Kontext einfügen:

<bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger"> 
    <constructor-arg name="name" value="youLoggerName" /> 
</bean> 

dann können Sie einfach Ihre Logger injizieren:

@Autowired 
private Logger logger; 
+0

Wenn wir den Logger über Bean erstellen, ist er in den Endpunkten des Aktor-Loggers nicht verfügbar. Also kann ich die Logger-Laufzeit nicht konfigurieren. Gibt es eine Möglichkeit, dass es in den Endpunkten des Aktor-Loggers verfügbar sein wird? – Nitul

5

Sie können haben Frühling eine Logger-Instanz autowire, aber es wäre eine sehr ungewöhnliche Sache zu tun (Sie würden eine Bohne von Logger Art müssen in Ihren Anwendungskontext sein). Der weitaus üblichere Ansatz ist es, den Logger zu initialisieren, wo er erklärt hat, ist es mit der Klasse zu konfigurieren, dass es für die Protokollierung verwenden werden:

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class MainController { 

    private final Logger logger = LoggerFactory.getLogger(MainController.class); 

} 
+2

Hat nicht auf die Frage beantworten, und ermutigt Verwenden eines schlechten Verhaltens im DI-Kontext. –

8

Wenn das Ziel hier Code-Reduzierung ist, versuchen Sie Project Lombok. Sie dann nicht einmal müssen Sie den Logger erklären - nur eine Anmerkung hinzufügen und log statt logger

So Ihre obigen Code nun wie folgt aussehen:

import javax.servlet.http.HttpServletResponse; 

import org.slf4j.Logger; 
// import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 

import lombok.extern.slf4j.Slf4j; 

@Slf4j 
@Controller 
public class MainController { 

    @RequestMapping("/") 
    public String enterSite(HttpServletResponse response) { 
     log.info("site entered"); 
     return "welcome"; 
    } 
}