programing

봄을 위한 log4j.properties 구성 방법JUNIT4 클래스 러너?

cafebook 2023. 7. 27. 22:17
반응형

봄을 위한 log4j.properties 구성 방법JUNIT4 클래스 러너?

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

기본적으로 appender는 콘솔로 출력되지만 다음과 같이 대상을 명시적으로 설정할 수도 있습니다.

log4j.appender.A1.Target=System.out

이렇게 하면 적절한 형식의 모든 출력이 콘솔로 리디렉션됩니다.자세한 내용은 Log4J 설명서에서 확인할 수 있습니다.

그러면 Log4J Logging이 올바르게 구성되고 이 경고가 사라집니다.

파일 문제를 해결하고 싶지 않으면 코드에서 다음과 같은 작업을 수행할 수 있습니다.

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 로깅이 활성화됩니다.WARNJava 콘솔을 사용하여 메시지를 기록합니다.

log4j.properties가 올바르게 구성되어 있습니다.그게 문제가 아닙니다.잠시 후 문제가 "캐시"에 오래된 빌드가 있고 새 빌드를 만들지 않은 Eclipse IDE에 있다는 것을 알게 되었습니다(Maven 종속성 문제).프로젝트를 수동으로 구축해야 했고 이제 작동합니다.

저는 이클립스에서 메이븐을 사용하고 있었고 루트 폴더에 속성 파일의 추가 복사본을 갖고 싶지 않았습니다.이클립스에서 다음 작업을 수행할 수 있습니다.

  1. 실행 대화 상자 열기(재생 버튼 옆의 작은 화살표를 클릭하고 실행 구성으로 이동)
  2. 클래스 경로 탭으로 이동
  3. 사용자 항목을 선택한 후 오른쪽에 있는 "고급" 단추를 누릅니다.
  4. 이제 "외부 폴더 추가" 라디오 단추를 선택합니다.
  5. 리소스 폴더 선택

오래된 일인 건 알지만, 저도 문제가 있었어요.메이븐과 이클립스를 사용하는 스프링 3의 경우, 유닛 테스트가 제대로 기록되려면 log4j.xml을 src/test/resources에 넣어야 했습니다.시험의 근원에 넣는 것은 저에게 효과가 없었습니다.이것이 다른 사람들에게 도움이 되기를 바랍니다.

중복 파일(테스트 및 메인의 log4j.properties)이 있는 것을 좋아하지 않고 테스트 클래스가 꽤 많기 때문에 각각 Spring과 함께 실행됩니다.JUNit4ClassRunner 클래스가 있어서 커스터마이즈를 해야 합니다.다음을 사용합니다.

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);
    }
}

사용 시 스프링 교체나의 봄과 함께하는 JUNIT4 클래스 러너JUNit4 클래스 러너

@RunWith(MySpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:conf/applicationContext.xml") 
public class TestOrderController {
    private Logger LOG = LoggerFactory.getLogger(this.getClass());

    private MockMvc mockMvc;
...
}

언급URL : https://stackoverflow.com/questions/4570072/how-to-configure-log4j-properties-for-springjunit4classrunner

반응형