자바에 대표적인 로깅 유틸리티로 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배 더 높고 대기 시간이 훨씬 더 짧다.
아래 그래프에서 성능 차이를 확인 해볼수 있다.
기타…
- Support for multiple APIs
- Avoid lock-in
- Automatic Reloading of Configurations
- Plugin Architecture 등..
https://logging.apache.org/log4j/2.x/index.html 참고..
Easy Migrating from Log4j 1.x
가장 간단한 방법은 log4j 1.x jar 파일을 Log4j 2의 log4j-1.2-api.jar로 대체하는 것이다. 그러나 성공적인 마이그레이션을 위해서는 다음 요구 사항을 충족해야 한다.
- 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 변경
- 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 변경시 프로그램 확인 리스트
- 메인 패키지가 log4j는 org.apache.log4j
log4j2는 org.apache.logging.log4j - org.apache.log4j.Logger.getLogger ()에 대한 호출을 org.apache.logging.log4j.LogManager.getLogger ()로 수정
- org.apache.log4j.Logger.getRootLogger () 또는 org.apache.log4j.LogManager.getRootLogger ()에 대한 호출은 org.apache.logging.log4j.LogManager.getRootLogger ()로 변경
- org.apache.log4j.Logger.getEffectiveLevel ()에 대한 호출을 org.apache.logging.log4j.Logger.getLevel ()로 변경
- org.apache.log4j.LogManager.shutdown ()에 대한 호출 제거
- Log4j Core가 시작시 JVM 종료 후크를 자동으로 추가, 코어 정리를 수행하므로 버전 2에서는 필요없음 - org.apache.log4j.Logger.setLevel () 제거(log4j2 에서는 지원하지 않음)
- 응용 프로그램은 문자열 연결 대신 매개 변수 이용