본문 바로가기
Programming/Languages (Java, etc)

JAVA logging framework (기본) - slf4j, log4j와 logback

by kghworks 2022. 1. 14.

목차

  • 로깅이란?
  • 로깅을하는 이유
  • log4j
  • logback
  • log4j2
  • slf4j (공통 추상체)
  • log4j2 vs logback
  • log4j2 보안 이슈

로깅이란?

시스템의 동작 시 상태 / 동작 정보 등을 시간의 경과에 따라 기록한 것을 로그, 이렇게 기록하는 행위를 로깅이라 함.


로깅을 하는 이유

로그는 프로그램 동작 과정, 기록 그 자체입니다. 

로그를 통해 시스템의 동작 과정, 사용자의 이용 패턴 등을 분석할 수 있고 나아가 법적인 분쟁이슈, 증거자료 등에도 충분히 쓰일 수 있습니다. 

 

JAVA에서 많이들 사용하는 logging framework에는 크게 2가지(log4j, logback)가 있고 그 상위에 구현체 한가지 (slf4j)가 있습니다.

이 글에서는 이 것들을 명확히 구분하여 인식하고자 합니다.


log4j

Apache (아파치)에서 만든 로깅 라이브러리입니다.

흔히 log4j, log4j2 이렇게 부른데 이는 간단히 말해 log4j 의 1.x 버전이 log4j, 2.x버전이 log4j2입니다.

 

log4j - log4j 1.x

log4j2 - log4j 2.x


logback

위 log4j를 기반으로 만든 또 다른 로깅 라이브러리입니다. log4j를 개발한 개발자가 만들었습니다.

구성요소

  • logback-core : 핵심기능 제공
  • logback-classic : 추가기능 (slf4j 기본 지원 등)
  • logback-access : http 엑세스 로그 

log4j2

 log4j2와 logback을 개선. slf4j 기본 지원

 

log4j와 logback의 발전 순서 (참고)

log4j -> logback -> log4j2


slf4j (공통 추상체)

이러한 로깅 모듈들이 공통적으로 구현하는 하나의 추상체입니다. 추상체의 필요이유는 interface의 존재이유와 동일합니다.

 

예를들어 log4j 1.x를 쓰고있는 프로젝트에서 logback으로 마이그레이션을 하고자 할 때

slf4j가 없다면 아래와 같이 진행할겁니다.

 

1. log4j 제거

2. logback 추가

3. 로깅 코드 전면 수정

 

3번 과정이 굉장히 거슬립니다. 첫번째로 로깅하는 모든 서버단 파일에 수정이 되고, 두번째로 경우에 따라 해당 파일들이 모두 커밋되면 conflict의 리스크도 존재합니다.

 

기존에 slf4j를 추가해놓은 상태였다면 어떨까요.

 

1. log4j  제거

2. logback 추가

3. 로깅코드 전면수정 (필요없음)

 

slf4j를 구현하는 라이브러리만 교체한 것이기 때문에 코드에 대한 수정이 없습니다.

물론 이럴 때는 기존에 로깅 시에 다음과 같이 slf4j를 호출하여 사용했다는 전제입니다.

이런 추상체가 필요한 이유는 여러분의 프로젝트를 보시면 알 수 있기도 합니다.

log4j를 쓰건 logback을 쓰건 아마도 대부분 slf4j library가 들어있을겁니다.

 

slf4j의 존재 이유 : slf4j를 모든 로깅 프레임워크가 구현하므로 slf4j를 호출하여 로깅을 하면, 로깅 프레임워크의 전환 작업(및 관리)이(가) 쉽다. (interface 추상화의 목적과 동일)


log4j2 vs logback

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

멀티 쓰레드 환경에서 log4j2의 처리량이 월등한 것을 확인할 수 있습니다. 

log4j2를 기준으로 다음과 같이 비교가 가능합니다.

 

logback

- log4j1 대비 향상된 성능

- 자동 리로드 제공

- slf4j를 기본적으로 지원

 

log4j2

- 자동리로드, 필터링 제공

- Apache에 따르면 logback대비 더 높은 처리속도

- 람다표현식 지원, 사용자 정의 LEVEL  

 

여러모로 log4j2가 더 낫습니다. logback의 기본 장점을 모두 가진채 세가지 프레임워크 중 가장 최신 버전의 가장 좋은 성능을 보여주기 때문입니다. 

 

그러나 log4j2의 보안이슈가 터집니다.


log4j2 보안 이슈

https://www.youtube.com/watch?v=qaeLkwhHZTo&feature=emb_title&ab_channel=KBSNews 

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36389 

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

log4j2에 치명적인 보안이슈가 발생했고 대응책은 위와 같이 KISA에 공지가 되었습니다.

log4j2의 가장 최신버전으로 업그레이드하거나 logback으로 교체를 해야하는 상황입니다.

 

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=36396&queryString=cGFnZT0xJnNvcnRfY29kZT0mc29ydF9jb2RlX25hbWU9JnNlYXJjaF9zb3J0PXRpdGxlX25hbWUmc2VhcmNoX3dvcmQ9bG9nYmFjaw== 

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

위 내용을 보면 logback 또한 보안이슈가 발생하여 1.2.9(안정화 버전)으로 업그레이드하라는 공지입니다.

 

기존의 로깅 프레임워크에 대한 이해도가 있어야 교체작업 혹은 업그레이드 작업이 순조롭게 진행 될 수있을 거라는 생각에 포스팅하게 되었습니다.

댓글