Java: 예기치 않은 로그 메시지의 근본 원인 찾기

5186 단어 javaspring
Java/Spring 앱을 개발하고 있다고 상상해 보십시오. 데이터베이스 구성에 대한 자습서를 올바르게 따르고 있습니다. 그러나 예상대로 작동하지 않습니다. 근본 원인에 대한 힌트를 제공하는 로그 메시지가 있지만 정확히 어디에서 오는지 알 수 없습니다. 이 블로그 게시물에서는 이 오류 메시지의 힌트를 활용하여 근본적인 문제를 해결하는 방법을 살펴봅니다.

예시



데이터 소스 구성이 URLjdbc:h2:mem:ksch로 구성된 경우에도 여전히 기본 URLjdbc:h2:mem:testdb이 사용되고 있습니다.

2022-04-02 09:53:26.037  INFO 27600 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        :
Starting embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'


JAR 검색



Maven 캐시의 모든 JAR 파일에서 로그 메시지를 검색하는 도구가 있다면 좋을 것입니다. 그리고 그것을 할 수 있는 도구가 있다는 것이 밝혀졌습니다.

https://github.com/Genivia/ugrep

설치


ugrep는 다양한 운영 체제에서 사용할 수 있습니다. 그러나 사용 가능한 Ubuntu 패키지가 없습니다. 그러나 프로젝트의 Dockerfile은 Ubuntu를 기반으로 합니다. 따라서 여기에서 도구를 수동으로 컴파일하는 데 필요한 단계를 얻을 수 있습니다.

sudo apt-get install -y \
  nmake \
  vim \
  git \
  clang \
  wget \
  unzip \
  libpcre2-dev \
  libz-dev \
  libbz2-dev \
  liblzma-dev \
  liblz4-dev \
  libzstd-dev \
git clone https://github.com/Genivia/ugrep
cd ugrep/
./build.sh
sudo make install


검색어



이제 프로젝트의 모든 종속성을 포함하는 Maven 캐시에서 의심스러운 로그 메시지를 검색할 수 있습니다.

$ cd ~/.m2/repository/
$ ugrep -z "Starting embedded database"
Binary file org/springframework/spring-jdbc/5.2.7.RELEASE/spring-jdbc-5.2.7.RELEASE.jar{org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseFactory.class} matches


따라서 "spring-jdbc"프로젝트에서 오고 로그 메시지가 발생한 파일과 줄을 검색할 수 있습니다.

https://github.dev/spring-projects/spring-framework/tree/971f665eb1e8cd9e8a0c788a8f5612f815894082/spring-jdbc

면책 조항: 원본 로그 메시지에서 로거 이름을 자세히 살펴보면 검사할 올바른 소스 파일을 더 빨리 찾을 수 있습니다. 하지만 그건 너무 쉽죠?



디버그



소스 코드에서 로그 메시지를 찾은 후 중단점을 설정하고 디버그 모드에서 앱을 시작할 수 있습니다. IDE에서 추가 탐색을 통해 데이터 흐름을 따라가면 문제의 근본 원인을 논리적으로 추론할 수 있습니다.



해결책



이 경우 근본 원인은 자동 구성을 취소한 사용자 지정 데이터 소스인 것으로 밝혀졌습니다.

@Configuration
class BffConfig {

    @Bean
    public EmbeddedDatabase dataSource() {
        return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2).addScript("org/springframework/session/jdbc/schema-h2.sql").build();
    }
}


솔루션은 사용자 정의 데이터 소스 빌더를 삭제하고 초기화 스크립트를 프로필 구성으로 이동하는 것입니다.

spring:
  datasource:
    data: classpath:org/springframework/session/jdbc/schema-h2.sql


참조



  • Searching for a string on multiple zip files

  • Spring Boot default H2 jdbc connection (and H2 console)

  • Spring Boot - Loading Initial Data
  • 좋은 웹페이지 즐겨찾기