2017-03-14 1 views
1

다음과 같은 문제가 있습니다 : How to set the log level to DEBUG during Junit tests? - Log4j가 아닌 java.util.logging으로 작업하고 있습니다.J.U.L.을 구성하는 방법 JUnit 테스트 중 로깅?

특히, 고객 요구 사항 (협상 가능하지 않음)을 준수하기 위해 Log4j의 기존 (메이븐 내장) 애플리케이션을 java.util.logging으로 변환합니다. 모든 것이 SLF4J를 사용하므로 코드 변경이 최소화됩니다. 몇 개의 모듈에 퍼져있는 수천 가지의 테스트 클래스가 있습니다. 현재 해당 모듈의 src/test/resourceslog4j.properties 파일이있어 테스트 로그 출력을 사용자 정의합니다.

개발자가 테스트를 중단하고 로그 출력을 읽으려는 경우, 로그 구성을 로컬에서 조정하는 것이 (신중하게 선택한 것보다) 선호하는 것이 좋을 것입니다.) 로그 레벨을 코드에 기록하면 "모든 정보에 기록 된"증후군이 발생합니다. 테스트 로그 config가 "테스트 조건에서 실행될 때 test + 응용 프로그램 코드"에 적용되도록합니다.

수많은 테스트 때문에 로그 클래스를 각 테스트 클래스 (여기에 제안 된대로 : How to set the Loglevel for a JUnit Test)에 추가하지 않으려합니다. 그것은 잘못된 해결책 인 것 같습니다. 또한 JVM의 logging.properties 파일을 편집하려고하지 않으므로 모든 것에 영향을 미칩니다. 이 앱 만 내가하는 유일한 것이 아닙니다. 나는 또한 모든 사람들이 똑같은 변화를 이루도록해야 할 것입니다.

Log4j가 클래스 경로에서 /log4j.properties을 선택하기 때문에 기존 시스템이 작동합니다. java.util.logging에 해당하는 메커니즘이 있습니까?

현재 생각 : 기존 설정을 바꾸기 위해 logging.properties 파일을 추가하고 Maven 설정을 해킹하여 java.util.logging.config.file 매개 변수를 가리 키도록 설정합니다. 더 좋은 방법이 있습니까?

답변

1

더 좋은 방법이 있습니까?

아마 가장 reliable method to set the logging configuration 일 것입니다.

java.util.logging과 동일한 메커니즘이 있습니까?

구성 옵션은 java.util.logging.LogManager 설명서에 나와 있습니다. 할 수 있습니다 :

  1. 속성을 설정하고 속성 파일을 사용하십시오.
  2. java.util.logging.config.class 속성을 설정하고 인수 생성자가없는 클래스 파일을 만들어 수동으로 로거를 구성하려는 코드를 실행하십시오.
  3. 새 구성을로드하려면 LogManager.readConfiguration(InputStream)ClassLoader.getResourceAsStream(String)을 사용하십시오. 이 로직은 java.util.logging.config.class 속성과 결합 될 수 있습니다.
+0

감사합니다! 산만 해지는 구름과 싸울 수 있다면 이번 주에 시험해 보길 바랍니다 .... – SusanW

+0

자, 마침내 그걸 가지고 놀았고, 프로젝트 전체에서 Maven을 설정하여 java.util.logging.config.file 파일을 추가했습니다. 내 질문에 메모를 추가하여 세부 정보를 보여 드리겠습니다. 감사! – SusanW

0

프로젝트 전체 src/test/resources/logging.properties 당신의 @BeforeClass 방법에 한 줄을 사용하여 java.util.logging.config.file 시스템 속성을 통해 단위 테스트를 위해 특별히 설정할 수 있습니다 귀하의 답변에 대한

System.setProperty("java.util.logging.config.file", ClassLoader.getSystemResource("logging.properties").getPath()); 
+0

"당신의 @BeforeClass 메서드"에서 말하면 - 모든 단일 테스트 클래스에서 그렇게해야한다고 생각합니다. 맞습니까? 그게 POM의 확실한 설정에서 설정하는 것보다 낫습니까? – SusanW

+0

@SusanW 예, 각 테스트 클래스는'@ BeforeClass'에서 필요합니다. 아마도 테스트 스위트에서 뭔가를 설정할 수도 있지만, 필요한 모든 것은 단위 테스트를 실행할 때 로깅 수준을 제어 할 수있는 한 줄짜리 코드입니다. 하나의'logging.properties' 파일 만 필요하지만 클래스 단위로도 할 수 있습니다. 리소스 이름을 변경하거나'this.getClass(). getResourceAsStream ('logging.properties')' 또는 비슷한 것. 다른 방법보다 좋고 나쁘게, 나는 Maven 대신 Ivy를 사용하고 JUnit과 Ivy를 깨끗하게 분리하는 것을 선호한다. – vallismortis