SpringJUnit4ClassRunner에 대한 log4j.properties를 구성하는 방법은 무엇입니까?
갑자기 이것은 JUnit 테스트 중에 계속 발생합니다. 모든 것이 작동하고 몇 가지 새로운 테스트를 작성했는데이 오류가 발생했습니다. 되 돌리면 사라지지 않습니다. 왜 그런 겁니까?
log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
직접 또는 간접적으로 작성한 새 테스트는 Log4j를 사용하여 로깅 하는 클래스를 사용 합니다.
이 로깅이 제대로 작동하려면 Log4J를 구성해야합니다.
테스트 클래스 경로 의 루트에 log4j.properties (또는 log4j.xml) 파일을 넣으십시오 .
다음과 같은 몇 가지 기본 구성이 있어야합니다.
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# An alternative logging format:
# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
어 펜더는 기본적으로 콘솔에 출력하지만 다음과 같이 명시 적으로 대상을 설정할 수도 있습니다.
log4j.appender.A1.Target=System.out
그러면 멋진 형식의 모든 출력이 콘솔로 리디렉션됩니다. 자세한 정보는 여기 Log4J 매뉴얼 에서 찾을 수 있습니다 .
그러면 Log4J 로깅이 올바르게 구성되고이 경고가 사라집니다.
파일을 사용하고 싶지 않다면 코드에서 다음과 같이 할 수 있습니다.
static
{
Logger rootLogger = Logger.getRootLogger();
rootLogger.setLevel(Level.INFO);
rootLogger.addAppender(new ConsoleAppender(
new PatternLayout("%-6r [%p] %c - %m%n")));
}
클래스 경로의 루트에 하나 이상의 어 펜더가있는 log4j.properties (log4j.xml) 파일을 추가하십시오.
파일 (log4j.properties)의 내용은 다음과 같이 간단 할 수 있습니다.
log4j.rootLogger=WARN,A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c %x - %m%n
이렇게하면 기본 로그 수준으로 log4j 로깅이 활성화 WARN
되고 Java 콘솔을 사용하여 메시지를 기록합니다.
log4j.properties가 제대로 구성되어 있습니다. 그것은 문제가 아닙니다. 잠시 후 문제가 "캐시"에 이전 빌드가 있고 새 빌드를 만들지 않은 Eclipse IDE에 있음을 발견했습니다 (Maven 종속성 문제). 프로젝트를 수동으로 빌드해야했는데 이제 작동합니다.
이클립스에서 Maven을 사용하고 있었고 루트 폴더에 속성 파일의 추가 복사본을 갖고 싶지 않았습니다. Eclipse에서 다음을 수행 할 수 있습니다.
- 실행 대화 상자 열기 (재생 버튼 옆에있는 작은 화살표를 클릭하고 실행 구성으로 이동)
- "classpath"탭으로 이동
- "사용자 항목"을 선택하고 오른쪽에있는 "고급"버튼을 클릭합니다.
- 이제 "외부 폴더 추가"라디오 버튼을 선택합니다.
- 리소스 폴더 선택
나는 이것이 오래되었다는 것을 알고 있지만 나도 문제가 있었다. Maven과 Eclipse를 사용하는 Spring 3의 경우 단위 테스트가 제대로 로깅되도록 src / test / resources에 log4j.xml을 넣어야했습니다. 테스트의 루트에 넣는 것은 나를 위해 작동하지 않았습니다. 바라건대 이것이 다른 사람들에게 도움이되기를 바랍니다.
Because I don't like to have duplicate files (log4j.properties in test and main), and I have quite many test classes, they each runwith SpringJUnit4ClassRunner class, so I have to customize it. This is what I use:
import java.io.FileNotFoundException;
import org.junit.runners.model.InitializationError;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Log4jConfigurer;
public class MySpringJUnit4ClassRunner extends SpringJUnit4ClassRunner {
static {
String log4jLocation = "classpath:log4j-oops.properties";
try {
Log4jConfigurer.initLogging(log4jLocation);
} catch (FileNotFoundException ex) {
System.err.println("Cannot Initialize log4j at location: " + log4jLocation);
}
}
public MySpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError {
super(clazz);
}
}
When you use it, replace SpringJUnit4ClassRunner with MySpringJUnit4ClassRunner
@RunWith(MySpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:conf/applicationContext.xml")
public class TestOrderController {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
private MockMvc mockMvc;
...
}
'developer tip' 카테고리의 다른 글
지도 (0) | 2020.11.20 |
---|---|
Java InputStream 닫기 (0) | 2020.11.20 |
SimpleXML 개체를 배열로 변환 (0) | 2020.11.20 |
getHeight는 모든 Android UI 개체에 대해 0을 반환합니다. (0) | 2020.11.20 |
큰 파일의 줄 수 (0) | 2020.11.20 |