Spring boot를 사용하면서, logback에서 log4j2로 변경하게 되었습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.version}</version>
</dependency>
다음과 같이 Spring boot를 사용하고 있는 상황에서 logback으로 프로젝트를 진행하고 있었습니다.
그러다 log4j2를 사용하게 변경하고자 하여, Spring boot starter web의 의존성중 하나인 spring boot starter logging을 exclusion처리한 후, log4j2를 직접 가져와 사용하기로 하였습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
<version>${log4j2.version}</version>
</dependency>
처음엔 다음과 같이 log4j2 의존성을 추가하여 사용하고자 하여, src/main/resources에 log4j2.xml을 추가한 후 사용하고자 하였습니다.
log4j2를 정상적으로 작동하는 것을 인텔리제이를 통하여 확인한 후, build한 바이너리를 실행하고자 하였으나, 다음과 같은 에러가 발생하면서 log4j2.xml에 지정한 pattern이 적용되지 않던 이슈를 발견하게 되었습니다.
main ERROR Unrecognized format specifier [d]
main ERROR Unrecognized conversion specifier [d] starting at position 16 in conversion pattern.
혹시 log4j2를 직접 추가하여서 문제가 된 것이 아닌가? 라는 생각이 들어 spring boot log4j2를 추가한 후 사용해보도록 하였습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.version}</version>
</dependency>
하지만 해당 이슈는 고쳐지지 않았고, 해당 이슈를 해결하기 위하여, 여러 블로그 및 깃헙 등 다양한 곳을 찾아해맨 결과 도저히 해결방안을 찾을 수 없었습니다.
그러던 와중, dependency는 우선순위가 존재한다. 라는 내용을 발견하게 되었고, 혹시나 하는 마음에 dependency의 순서를 변경해 보았습니다.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>${spring.version}</version>
</dependency>
다음과 같이 log4j2를 먼저 가져온 다음, Spring boot starter web을 통하여 가져오는 방식으로 진행하도록 수정한 후 실행해본 결과.....
정상적으로 log4j2.xml의 pattern을 가져와 사용하는 것을 확인하였습니다.
시도한 내용
1. mvn dependency:tree를 통하여 내용 확인하여 충돌하는 의존성이 있었는가? x
2. 그냥 log4j2가 아닌 Spring boot log4j2를 사용하는 방식으로 시도해 보았는가? O - 그러나, 관련 없었음
3. 검색해보니 나오는 shade maven build 방식을 채택하여 실행해 보았는가? O - 이것 또한 관련이 없었음
알게된 사실
1. dependency는 우선순위가 존재한다.
2. Spring boot 의존성은 제일 마지막에 선언해두자
'Java > Spring' 카테고리의 다른 글
Service에서 Argument 사용하기 (0) | 2024.08.07 |
---|---|
Spring boot에서의 logback 설정 (0) | 2024.08.05 |
예외 처리 방법 (0) | 2024.07.07 |
Http Method의 종류와 사용법 (0) | 2022.03.15 |
스프링의 실행 순서 (0) | 2022.03.11 |
댓글