log4j에서 log4j2 Migration

박상수
8 min readOct 23, 2019

자바에 대표적인 로깅 유틸리티로 log4j를 꼽을 수 있다.

log4j to log4j2 변환작업 권고

변환을 하는 가장 큰 이유는 2015년 8월 5일 Apache Logging Services Project Management Committee 에서 Log4j 1.x 프로젝트 진행종료를 발표 했다.

* Apache™ Logging Services™ Project Announces Log4j™ 1 End-Of-Life; Recommends Upgrade to Log4j 2

Log4j 1의 사용자는 Apache Log4j 2로 업그레이드 하는 것을 권고한다.

log4j2 변환의 이유

성능에서 큰 차이를 보인다. 개발 순서가 log4j -> logback -> log4j2 순으로 만들어졌으며 log4j2는 다중 스레드 시나리오에서 비동기식 로거는 Log4j 1.x 및 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다.

아래 그래프에서 성능 차이를 확인 해볼수 있다.

https://logging.apache.org/log4j/2.x/performance.html

기타…

Easy Migrating from Log4j 1.x

가장 간단한 방법은 log4j 1.x jar 파일을 Log4j 2의 log4j-1.2-api.jar로 대체하는 것이다. 그러나 성공적인 마이그레이션을 위해서는 다음 요구 사항을 충족해야 한다.

  1. Appenders, LoggerRepository 또는 Category의 callAppenders 메소드와 같은 Log4j 1.x 구현 내부의 메소드 및 클래스에 액세스하면 안됩니다.

2. 프로그래밍 방식으로 Log4j를 구성해서는 안됩니다.(SLF4J 이용)
- SLF4J(Simple Logging Facade for Java): facade pattern 을 이용하여 Log4J, Logback, Log4j2 호환 가능하게 만드는 추상화 프레임워크

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory;
public class Test{
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Test.class);
logger.debug("slf4j TEST TEST");
}
}

3. DOMConfigurator 또는 PropertyConfigurator 클래스를 호출하여 구성하지 않아야합니다.

Log4j -> Log4j2 변경

  1. POM.XML변경
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
<!-- //spring framework 사용시 기본 로깅이랑 중복해서 동작할 수도 있어서 exclude 처리 -->
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
</dependency>

2. import 변경

//import org.apache.log4j.Logger; // 기존 패키지 주석 처리
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

3. 사용 클래스 및 메서드 변경

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory;
public class Test{
public static void main(String[] args) {
// Logger logger = Logger.getLogger(Test.class); //기존 소스 주석처리
Logger logger = LoggerFactory.getLogger(Test.class);
logger.debug("slf4j TEST TEST");

}
}

4. log4j.xml 를 log4j2.xml로 교체
- 문법도 교체된다.
> https://logging.apache.org/log4j/2.x/manual/migration.html 참고

//Before
<log4j:configuration xmlns:log4j=’http://jakarta.apache.org/log4j/’>
<appender name=”STDOUT” class=”org.apache.log4j.ConsoleAppender”>
//After
<Configuration>
<Console name=”STDOUT” target=”SYSTEM_OUT”>

* log4j2.xml 참고

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.apache.log4j.xml" level="info"/>
<Root level="debug">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>

Log4j2 변경시 프로그램 확인 리스트

  1. 메인 패키지가 log4j는 org.apache.log4j
    log4j2는 org.apache.logging.log4j
  2. org.apache.log4j.Logger.getLogger ()에 대한 호출을 org.apache.logging.log4j.LogManager.getLogger ()로 수정
  3. org.apache.log4j.Logger.getRootLogger () 또는 org.apache.log4j.LogManager.getRootLogger ()에 대한 호출은 org.apache.logging.log4j.LogManager.getRootLogger ()로 변경
  4. org.apache.log4j.Logger.getEffectiveLevel ()에 대한 호출을 org.apache.logging.log4j.Logger.getLevel ()로 변경
  5. org.apache.log4j.LogManager.shutdown ()에 대한 호출 제거
    - Log4j Core가 시작시 JVM 종료 후크를 자동으로 추가, 코어 정리를 수행하므로 버전 2에서는 필요없음
  6. org.apache.log4j.Logger.setLevel () 제거(log4j2 에서는 지원하지 않음)
  7. 응용 프로그램은 문자열 연결 대신 매개 변수 이용

참고

--

--