이것이 새로운 응용 프로그램을 수행하는 방법입니다. 다양한 문제가 발생합니다. 어제, 나는 특정 클래스를로드 할 때 클래스 로더에서 클래스 문제가 보이지 않았다. 오늘 저는 제 2 자 라이브러리와 관련된 로그 파일을 찾지 못하는 문제가 발생했습니다. 그것에 대해 하나씩 이야기합시다.
정상적인 상황에서는 아래 그림과 같이 SRC/Main/Resources 디렉토리 (로그백 로그 시스템 사용)에 logback-spring.xml 구성 파일을 내려 놓습니다.
spring.application.name = application.properties에서 spring-boot-demo-application을 설정합니다
2 자 패키지에는 logback.xml이 있습니다
위의 구성에 따르면, 실행 후, 정상적인 상황에서는 application.log log 파일이 user.home/spring-boot-demo-demo-demo-demo-demo-demo-demo-demo-application/logs 디렉토리에 포함되어야하지만 그렇지 않습니다. 스프링 부트 데모 응용 폴더조차 생성되지 않았습니다.
로그 시스템에서 로그 구성 파일을 찾아 구문 분석하는 방법을 살펴 보겠습니다. SpringBoot는 LoggingApplicationListener 클래스를 사용하여 로그 시스템을 초기화합니다. LoggingApplicationListener는 ApplicationListener 인터페이스를 구현합니다. 그런 다음 타이밍 차트를 통해 LoggingApplicationListener의 OnApplicationEvent 메소드가 무엇을하는지 확인할 수 있습니다.
코드 (8) 표준 로그 구성 파일을 찾으십시오. 표준은 무엇입니까? 그런 다음 코드 코드 (9)를보십시오.
보호 된 문자열 [] getStandardConfigLocations () {return new String [] { "logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"}; }"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"와 같이 표준입니다.
따라서 코드 (10)에 따라 다릅니다.
개인 문자열 findConfig (string [] locations) {for (문자열 위치 : 위치) {classPathResource resource = new ClassPathResource (위치, this.classloader); if (resource.exists ()) {return "classpath :" + location; }} return null; }ClassPathResource 클래스를 사용하여 검색을 통해 ClassPathResource의 존재 방법을 확인해 봅시다.
public boolean이 존재합니다 () {return (resolveUrl ()! = null); } protected url resolveUrl () {if (this.clazz! = null) {return this.clazz.getResource (this.path); } else if (this.classLoader! = null) {repty this.classload.getResource (this.path); } else {return classLoader.getSystemResource (this.path); }}this.classload.getResource (this.path)를 볼 수 있습니다. 클래스 로더를 AppClassLoader로 찾으려면
코드 (8)가 구성을 찾지 못하면 실행 지점 (12). 논리와 코드 (8)는 비슷하지만 파일 이름은 다릅니다. 다음을 살펴 보겠습니다.
보호 된 문자열 [] getSpringConfigLocations () {String [] locations = getStandardConfigLocations (); for (int i = 0; i <locations.length; i ++) {String Extension = StringUtils.getFilenameextension (locations [i]); 위치 [i] = 위치 [i] .Substring (0, 위치 [i] .length () - Extension.length () -1) + "-spring". + 확장; } 반환 위치; }스프링이 getStandardConfigLocations의 파일 이름에 스플릿이 접합되고 스 플린트 파일 이름은 다음과 같습니다.
"" ""로그백 테스트-스프링 .groovy ","logback-test-spring.xml ","logback-spring.groovy ","logback-spring.xml "
요약하면, SpringBoot는 먼저 표준 로그 구성 파일을 검색합니다. 스프링 구성을 분할하는 파일을 찾을 수없는 경우.
따라서 우리는 Logback.xml이 포함 된 JAR 패키지가 응용 프로그램에 도입 되었으며이 JAR 패키지는 AppClassLoader를 사용하여로드되었다고 말했습니다. 따라서 단계 (8)를 실행할 때 JAR 패키지의 logback.xml이 발견되었으므로 더 이상 Step (12)를 실행하여 사용자 정의 된 logback-spring.xml을 찾을 수 없습니다.
솔루션 1 : 구성 파일을 logback.xml로 수정하여 (8)에서 먼저 logback.xml을 찾아야합니다.
해결책 2 : logback.xml을 포함하는 2 자 패키지를 피하십시오. 이 경우, 우리 자신의 구성이 logback-spring.xml인지 logback.xml인지 여부는 아무런 문제가 없습니다.
일일 개발에서 제 2 자 패키지에는 로그 구성 파일이 포함되어서는 안됩니다. 제 2 자 라이브러리에 사용 된 로그는 일반적으로 코드를 사용하여 생성됩니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.