jar 실행 시 /resources/log4j2.xml 파일을 못 찾고 오류가 발생하는 경우
스프링 프로젝트에서 로깅 구현체로 log4j2를 사용하는 과정에서 '/src/main/resources/' 경로에 'log4j2.xml' 파일이 있어 이클립스 환경에서는 로깅이 정상적으로 동작했으나, 'Runnable Jar file'을 통해 jar 파일로 만들어 동작시켰을 때 resources 하위에 있는 Log4j2.xml 파일을 찾지 못하고 위와 같은 오류가 발생하였습니다.
<!-- log4j 2.12.x 하위 버전 기준 오류 메시지 -->
ERROR StatusLogger No Log4j 2 configuration file found.
Using default configuration (logging only errors to the console), or user programmatically provided configurations.
<!-- log4j 2.8.x 하위 버전 기준 오류 메시지 -->
ERROR StatusLogger Log4j2 could not find a logging implementation.
Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
버전 별로 발생하는 오류 메시지의 차이가 있으며, 'log4j 2.13.0' 버전을 기준으로 최신 버전의 경우 오류가 발생하지 않고 기본 설정값이 적용되어 동작합니다.
즉, log4j 2.13.0 버전 이상일 때 jar 파일 실행 시 log4j2.xml 파일이 적용되지 않는 경우도 아래 해결 방법이 도움이 될 수 있습니다.
(log4j2는 log4j의 2.x 버전을 의미합니다.)
오류의 원인 찾기
프로젝트에서 /src/main/resources/ 경로에 log4j2.xml 파일이 정상적으로 존재하며, 이클립스 환경에서 실행 시 다음과 같이 정상적으로 로깅이 되는 것을 확인할 수 있는데요.
현재 상태에서 프로젝트 'Export' -> 'Runnable JAR file' 과정을 통해 jar 파일을 생성하여 실행하게 되면 log4j2.xml 파일을 찾을 수 없다는 위 오류가 발생하게 됩니다.
(해당 코드는 문제 상황을 재연하기 위해 간단한 main 메서드만 가진 스프링 프로젝트를 만든 것입니다.)
먼저 Export 과정을 통해 생성된 jar 파일 내부를 살펴보겠습니다.
resources 디렉터리 하위에 log4j2.xml 파일이 정상적으로 존재하는 것을 볼 수 있는데요.
원인을 찾지는 못했지만 log4j2.xml 파일을 '/resources/' 경로가 아닌 '/' 경로에 바로 위치시켰을 때는 jar 파일이 log4j2.xml 파일을 정상적으로 찾아 로깅이 동작한다는 것을 확인하였습니다.
(해당 파일을 찾지 못하는 이유가 MANIFEST.MF 파일의 'Class-Path'와 관련이 있지 않을까 하여 관련 내용을 찾아보았으나, 'Class-Path'는 Java 클래스나 외부 라이브러리 같은 클래스 파일을 참조할 때 사용되는 것으로 xml 파일을 찾지 못하는 것과는 상관이 없는 것으로 확인되었습니다.)
ERROR StatusLogger No Log4j 2 configuration file found. 오류 해결 방법
1. jar 파일 위치에 log4j2.xml 파일을 추가
가장 간단한 방법으로 jar 파일이 있는 위치에 log4j2.xml 파일을 함께 두고 jar 파일을 실행하면 해당 설정 파일을 읽어 정상적으로 동작하는 것을 확인할 수 있습니다.
2. JVM 인자를 사용하는 방법
java -Dlog4j2.configurationFile=resources/log4j2.xml -jar example.jar
두 번째 방법으로 jar 실행 시 '-Dlog4j2.configurationFile=' 옵션을 통해 log4j2.xml 파일의 경로를 명시해 주는 방법이 있습니다.
위 예시와 같이 jar 파일의 resources/ 경로에 log4j2.xml 파일이 있다는 것을 명시해 주면 해당 파일을 정상적으로 찾아 로깅이 되는 것을 확인할 수 있습니다.
3. log4j2.xml 파일을 jar 파일의 '/' 경로에 추가하는 방법
// 1. jar 명령어를 통해 log4j2.xml 파일을 '/' 경로에 추가
jar uvf practice.jar log4j2.xml
//adding: log4j2.xml(in = 1330) (out= 570)(deflated 57%)
// 2. zip 명령어를 통해 log4j2.xml 파일을 '/' 경로에 추가
zip -r practice.jar log4j2.xml
//adding: log4j2.xml (deflated 57%)
jar 또는 zip 명령어를 통해 log4j2.xml 파일을 '/' 경로에 추가시켜 주는 방법입니다.
정석적인 해결 방법은 아닐 수 있지만 일단 정상적으로 동작이 되며, 2번 방법처럼 jar 파일 실행 시 추가로 옵션을 주지 않아도 된다는 장점이 있습니다.
< log4j2 관련 자료 >
2024.02.27 - [Programming/Spring] - (spring) logback, log4j2 로깅 적용 과정과 xml 파일 차이점 정리
2021.08.25 - [Programming/Spring Boot] - Spring Boot Logging 이란? (log4j, logback, log4j2)
'Programming > Error' 카테고리의 다른 글
Could not load JDBC driver class [org.h2.Driver] 발생 원인과 해결 방법 (0) | 2024.08.11 |
---|---|
(Jeus) The server adminServer initialization failed because of a stream closed error. (0) | 2024.08.05 |
eclipse Spring Legacy Project 생성 과정에서 발생한 오류 (0) | 2024.01.07 |
(docker) maven:3.6.3-jdk-8: no match for platform in manifest (0) | 2023.10.25 |
@RedisHash keyspace 사용 시 주의할 점 (RedisKeyValueAdapter) (0) | 2023.06.22 |