한줄요약
log4j2는 java진영의 최신 로깅 라이브러리 이며 성능이 좋기에 도입을 추천드립니다.
로깅라이브러리를 도입해야하는 이유
일부 개발자는 개발하면서 system.out.println() 을 이용해서 로깅하시는 분들도 있습니다.
하지만, sysout(System.out)은 로깅에 사용하면 성능상 좋지 않습니다.
이유는 아래와 같습니다.
System.out.println()과 System.out.print() 메서드는 내부적으로 write()랑 newLine()을 사용하는데,
write()와 newLine()이 동기화(synchronized) 메서드이기에 성능이 저하됩니다.또한, 이 메소드는 Blocking I/O로 호출되기에,
해당 메소드가 호출되는 시간동안 CPU가 놀게 되기 때문에 성능 저하의 원인이 됩니다.
java에서의 로깅 라이브러리 인터페이스 - slf4j
slf4j란, Simple Logging Facade for Java (SLF4J)의 약자로,
java.util.logging, log4j 1.x, reload4j 및 logback과 같은 다양한 로깅 프레임워크에 대한 간단한 facade(퍼사드) 또는 추상화 역할을 합니다.
여기서 facade란 서브시스템에 있는 인터페이스들에 대한 통합된 인터페이스를 제공하고,
서브시스템을 더 쉽게 사용할 수 있도록 만드는 더 높은 수준의 인터페이스를 제공하는 디자인 패턴 입니다.
아래와 같은 구조로, logback이나 log4j2같은 다른 라이브러리를 쓰더라도
개발자는 framework코드나 자신이 개발한 코드 등에서 slf4j api를 사용하여 로깅라이브러리를 쉽게 적용할 수 잇습니다.
log4j, logback, log4j2
slf4j는 인터페이스이고, 로깅을 수행하기 위한 구현체들은 log4j, logback, log4j2 등이 있습니다.
log4j -> logback -> log4j2 순으로 개발이 되었습니다.
log4j : 가장 오래된 로깅 라이브러리이며, log4j는 2015에 지원종료를 선언하였습니다.
logback : log4j를 대체하기 위해 만들어진 대표적인 로깅 라이브러리입니다.
log4j를 설계한 Ceki Gulgu에 의해 설계되었습니다.
성능을 위해 재개발되었으며, 오랫동안 검증된 log4j 아키텍처 기반으로 개발되었습니다.
springboot의 기본 log로 사용되고 있습니다.log4j2 : log4j에 이어서 만들어진 라이브러리이며, 아래와 같은 장점들이 있습니다만,
개인적으로는 개선된 속도가 가장 큰 장점이라고 생각합니다.
- 개선된 가독성. Log4j 1이나 로그백과 같은 프레임워크를 재구성하는 동안 메시지는 소실되지 않음.
- 확장성. Log4j 2는 플러그인 시스템을 지원하므로 사용자들이 사용자 지정 구성 요소를 정의하고 구성할 수 있음.
- 단순화된 구성 문법
- xml, json, yaml, properties 구성 지원
- 개선된 필터
- 구성 파일, 시스템 속성, 환경 변수, ThreadContext Map, 이벤트 내 데이터에 정의된 값의 속성 찾기 지원
- 여러 API 지원: Log4j 2는 Log4j 2, Log4j 1.2, SLF4J, Commons Logging, java.util.logging (JUL) API를 사용하여 응용 프로그램과 함께 사용할 수 있음.
- 레이지 로깅(lazy logging)을 위한 자바 8 스타일의 람다 지원
- 사용자 지정 로그레벨/메시지 오브젝트 지원
- 개선된 속도
log4j2 성능비교
아래는 log4j2 홈페이지에서 시간당 처리량을 측정한 성능비교표입니다.
Log4j2 Async Loggers의 경우에 쓰레드가 많을수록, 성능이 월등히 좋은것을 확인할 수 있습니다.
Log4j2 Async Loggers는 lock-free data structure를 쓰고,
Logback, Log4j 1.2, Log4j 2’s Asynchronous Appenders 는 ArrayBlockingQueue을 쓰기 때문인것으로 공식홈페이지에서 설명합니다.
(ArrayBlockingQueue은 lock 을 사용하기에 성능저하)