현재 운영하는 시스템은 로깅 라이브러리로 log4j를 사용하고 있다. 1달 예상으로 신규 기능을 추가하는 작업을 진행하고 있는데, 이참에 log4j를 logback으로 전환하는 작업을 진행하였다.
logback이란?
logback은 log4j를 만든 개발자가 log4j를 토대로 새롭게 만든 Logging 라이브러리다.
우선 logback 사용시 얻게 되는 몇가지 장점에 대해 알아보자.
- log4j보다 약 10배 정도 빠르게 수행되도록 내부가 변경되었으며, 메모리 효율성도 좋아졌다.
- log4j때부터 광범위한 테스트를 진행한 경험을 가지고 있으며, logback은 더욱 높은 레벨의 테스트를 통해 검증되었다.
- 문서화가 잘 되어 있다.
- 설정 파일을 변경하였을 경우, 서버 재기동 없이 변경 내용이 자동으로 갱신된다.
- 서버 중지 없이 I/O Faliure에 대한 복구를 지원한다.
- RollingFileAppender를 사용할 경우 자동적으로 오래된 로그를 지워주며 Rolling 백업을 처리한다. (log4j를 사용했을땐 이 기능이 없어서 오래된 로그를 쉘 스크립트로 수동으로 삭제했었다.)
logback과 slf4j
logback을 사용하기 위해선 slf4j(simple logging facade for java)를 함께 사용해야 한다. slf4j는 facade 패턴을 적용한 로깅 프레임워크다. facade 패턴은 인터페이스와 비슷한 역할이라 할 수 있다. slf4j와 함께 개발자는 원하는 로깅 라이브러리를 선택해 사용하면 된다. 따라서 slf4j를 사용한다면 개발하면서 로깅 라이브러리 변경이 필요한 경우 쉽게 교체가 가능하다.
logback과 slf4j 라이브러리 관계 다이어그램
라이브러리명 |
설명 |
logback-core.jar |
logback 코어. |
logback-classic.jar |
slf4j에서 logback을 호출할 수 있도록 처리. |
jcl-over-slf4j.jar (선택) |
apache commons 로깅 -> slf4j 전환. |
log4j-over-slf4j.jar (선택) |
log4j 로깅 -> slf4j 전환. |
jcl-over-slf4j.jar와 log4j-over-slf4j.jar 라이브러리는 기존에 사용하는 코드 또는 써드파티 라이브러리가 다른 로깅 라이브러리를 사용하고 있을 경우, 이를 전환해주는 플러그인 라이브러리다. 로깅 라이브러리를 변경했을 경우나 오픈소스 라이브러리를 사용할 경우 잘 챙겨야 하는 라이브러리다.
pom.xml 설정
총 5개의 라이브러리를 dependency로 추가한다.
appender 설정
resources 하위에 logback.xml 파일을 생성한다. 설정이 없을 경우 logback BasicConfigurator 기본설정 전략을 따른다.
적용시 유의할 점
만약 기존에 logback이 아닌 log4j가 slf4j와 연동되어 있을 경우, 반드시 slf4j-log4j12.jar 라이브러리를 제거해야 한다. slf4j-log4j12.jar 라이브러리는 slf4j가 log4j에게 로깅 처리를 호출하는 라이브러리인데, 이 라이브러리가 포함되어 있을 경우 다음과 같은 이슈가 발생한다.
- slf4j 멀티 바인딩 이슈 발생.
- log4j-over-slf4j.jar가 포함되어 있을 경우, 순환 오류로 인한 StackOverflowError 발생.
이 문제점들은 써드파티 라이브러리 dependency 추가시에도 발생할 수 있다. 써드파티 라이브러리에 slf4j-log4j12.jar가 dependency가 되어 있을 수 있다. 이 경우 반드시 exclusion을 해줘야 한다.
http://stackoverflow.com/questions/31044619/slf4j-log4j12-vs-log4j-over-slf4j
참고자료