샘플 스프링 부트애플리케이션의 필드에 로거를 주입하려면 어떻게 해야 합니까?
내가 원하는 것은 봄 자동 배선을 로거로 만드는 것이다.다시 말해, 저는 이 작업을 하고 싶습니다.
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";
}
}
현재 부팅 시 예외가 발생합니다. "유형 [org.slf4j]의 적격 빈이 없습니다.종속성에 대한 Logger]를 찾았습니다..".
pom.xml 의존관계:
<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>
이 글을 읽었습니다.http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ #boot-boot-http-http-http:
Starter POM 중 하나를 사용하는 경우(I do) Logback이 사용되지만 내부 로깅에 사용됩니다.제 수업에서 자동 전원을 켤 수 있나요?
여기서의 목적이 코드 리덕션이라면 Project Lombok을 사용해 보세요.그러면 로거를 선언할 필요도 없습니다. 주석을 추가하고 사용하세요.log대신logger
위의 코드는 다음과 같습니다.
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";
}
}
로거빈을 콘텍스트에 직접 추가하여 클래식바인드를 재현할 수 있는 일반적인 방법은 아닙니다.
private final Logger logger = LoggerFactory.getLogger(MainController.class);
스프링 콘텍스트에 삽입하기만 하면 됩니다.
<bean id="logger" scope="prototype" class="org.slf4j.LoggerFactory" factory-method="getLogger">
<constructor-arg name="name" value="youLoggerName" />
</bean>
로거를 주입하기만 하면 됩니다.
@Autowired
private Logger logger;
솔루션 사용@Bean:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InjectionPoint;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@Configuration
public class LoggerConfiguration {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Logger logger(InjectionPoint injectionPoint){
return LoggerFactory.getLogger(injectionPoint.getMethodParameter().getContainingClass());
}
}
그런 다음 컨스트럭터 주입을 사용하여 로거를 주입합니다(필드 주입은 작동하지 않습니다).
@Service
class SomeService {
private Logger logger;
public SomeService(Logger logger;) {
this.logger = logger;
}
public void someMethod() {
logger.error("Some log");
}
}
Spring autowire instance는 사용할 수 있지만 매우 이례적인 작업입니다(빈 타입이 필요합니다).Logger응용 프로그램 컨텍스트에 포함되도록 합니다.보다 일반적인 방법은 로거가 선언된 곳에서 로거를 초기화하고 로깅에 사용하는 클래스로 로거를 설정하는 것입니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MainController {
private final Logger logger = LoggerFactory.getLogger(MainController.class);
}
이렇게 해서 현장 주입을 하게 된 거야
Logging Configuration(로그 설정).자바
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoggingConfiguration {
@Bean
public Logger log() {
var log = LoggerFactory.getLogger("com.bitsmonkey.dummy");
return log;
}
}
컨트롤러 내부
Dummy Controller.java
@Controller
public class DummyController {
@Autowired
private Logger log;
//......
언급URL : https://stackoverflow.com/questions/26517309/how-do-i-inject-a-logger-into-a-field-in-the-sample-spring-boot-application
'programing' 카테고리의 다른 글
| json 어레이 스트림을 한 번에 하나씩 역직렬화 (0) | 2023.03.18 |
|---|---|
| 워드프레스에서 mysql 쿼리를 실행하려면 어떻게 해야 하나요? (0) | 2023.03.18 |
| SQL ROWNUM 특정 범위 사이의 행을 반환하는 방법 (0) | 2023.03.18 |
| reactjs - 배경색 인라인 스타일 설정 방법 (0) | 2023.03.18 |
| jQuery.ajax 성공 콜백 함수가 실행되지 않았습니다. (0) | 2023.03.18 |