Spring

[Spring] logback, log4j2 로깅

worldcenter 2024. 12. 24. 23:05

 

Log란?

개발을 할 때 로깅은 개발자에게 여러 정보를 전달해주는 역할을 합니다. 개발자가 필요한 정보를 직접 로깅할 수도 있고 애플리케이션이 예상치 못한 동작을 했을 때 error 정보를 전달해주기도 합니다. 또한, 로그를 통해 서비스를 이용하는 사용자가 자주 사용하는 기능을 분석하여 사용자의 니즈를 찾아 품질이 높은 서비스를 제공할 수도 있습니다.

 

이렇게 중요한 로그를 System.out.println()으로 출력하면 어떻게 될까요? 로그는 시스템의 상태를 알려주는 정보이기 때문에 방대한 양을 담고 있습니다. 그런데 이런 로그를 System.out.println()으로 찍게 되면 상세한 로그를 못 찍을 뿐만 아니라 방대한 정보를 효율적으로 관리할 수 없습니다. 그렇기 때문에 Spring에서는 SLF4J를 통해 logback이나 log4j2와 같은 로깅 프레임워크를 사용합니다.

 

 

SLF4J란?

SLF4J(Simple Logging Facade for Java) 라는 이름에서 알 수 있듯이 파사드 패턴이 적용되어 logback, log4j2와 같은 로깅에 대한 추상 레이어를 제공하는 추상화 로깅 라이브러리 입니다. 

 

그렇다면 왜 SLF4J라는 추상 라이브러리를 사용하는 이유는 무엇일까요?

 

만약 SLF4J 없이 log4j2를 사용하다가 치명적인 보안 이슈가 발견되어 걷어내고 logback으로 변경해야 하는 경우가 생기면 log4j2를 사용한 전체 코드를 수정해야 합니다. 하지만, 추상 인터페이스를 사용함으로써 전체 코드를 수정하지 않고 로깅 프레임워크만 변경해주면 됩니다. 즉, JDBC Driver나 Cache Manager와 비슷한 역할을 합니다.

 

파사드 패턴 이란?

GoF 디자인 패턴 중 구조적 패턴에 속하며, 복잡한 서브시스템을 단순화하여 사용할 수 있도록 하는 인터페이스를 제공하는 것을 목표로 합니다. 즉, 여러 클래스나 복잡한 로직이 얽혀 있는 시스템에서 하나의 통합된 간단한 인터페이스를 제공하여 사용자와 시스템 간의 상호작용을 쉽게 만드는 패턴 입니다.

 

 

logback, log4j2, log4j

SLF4J 추상 인터페이스에 사용할 수 있는 구현체로 크게 log4j, logback, log4j2 3가지가 있습니다. 등장 순서도 log4j > logback > log4j2 입니다. logback과 log4j2는 둘 다 log4j를 기반으로 하고 있으며, log4j는 2015년 지원이 중단되었기 때문에 logback과 log4j2가 많이 사용되고 있습니다.

특히 log4j2의 경우 아래 이미지에서 볼 수 있는 것처럼 상대적으로 비동기 로깅에서의 성능적 강점을 가지고, 다중 스레드 환경에서 높은 성능을 제공합니다. 다음 링크의 공식 문서에 따르면 동기 처리 속도 또한 logback 및 log4j에 비해 빠르다고 합니다.

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

 

 

스프링부트에서는 spring-boot-starter-web 라이브러리를 사용하면 기본적으로 Logback이 설정되어 있어 앱을 실행하면 다음과 같이 로그를 확인할 수 있습니다.

 

 

logback vs log4j2

Logback

이는 SLF4J의 구현체이며, 현재 자바 로깅 프레임워크의 가장 인기 있는 구현체 입니다. 실제로 스프링부트는 slf4j + Logback 조합을 디폴트로 사용합니다.

 

Log4j2

가장 최근에 나온 프레임워크이며, Logback과 마찬가지로 slf4j를 구현합니다. 이와 동시에 Logback이 지원하는 자동 리로드 기능과 고급 필터링 기능을 제공합니다. 

차이점은 Apache에 따르면 멀티 스레드 환경에서 비동기 로거인 Async Logger의 처리량이 대략 18배 높고 대기 시간이 더 짧다고 합니다. 

 

이번 토이 프로젝트에서 둘 중 어떤 로깅 프레임워크를 사용할까 고민하던 중 Logback을 사용하기로 결정하였습니다.

그 이유는 아래와 같습니다. 

 

1. 2024년 현재 개발자들이 기본적으로 사용하는 프레임워크 입니다.

2. 토이 프로젝트 특성 상 높은 로깅 처리량을 요구하지 않습니다.

3. Log4j2의 보안 취약점 이슈(링크)

 

비록 Log4j2의 버전 2.17.1 이상에서는 보안 패치가 이루어져있지만, 보수적으로 고민했을 때 Logback이 더 낫다고 판단하여 위와같이 결정하게 되었습니다.

 

Logback 사용 시 유의점

Logback에서도 유사한 취약점(CVE-2021-42550)이 발견된 상태이므로 logback 사용 시에도 1.2.9 이상을 사용해야 합니다. 단, 이 취약점은 아래 조건에 모두 해당 되어야 공격이 가능하므로 하기 항목을 반드시 점검해야 합니다.

1. logback 1.2.9 이상 사용
2. logback.xml 등의 로그 설정 파일의 편집 권한을 확인(사용자 본인만 편집할 수 있도록 권한 수정)
3. logback 설정에 scan="true" 속성이 포함되어 있는지 확인

 

 

참조

https://velog.io/@woosim34/Springboot-Logback-%EC%84%A4%EC%A0%95%ED%95%B4%EB%B3%B4%EA%B8%B0

https://wildeveloperetrain.tistory.com/348

 

(spring) logback, log4j2 로깅 적용 과정과 xml 파일 차이점 정리

logback, log4j2 로깅 적용 과정과 xml 파일 차이점 정리 해당 포스팅은 스프링 프로젝트에서 로깅 시 사용되는 라이브러리인 'logback(+ logback.xml)'과 'log4j2(+ log4j2.xml)'을 적용하는 각각의 방법과 차이

wildeveloperetrain.tistory.com

https://dingdingmin-back-end-developer.tistory.com/entry/Springboot-Log-%EB%82%A8%EA%B8%B0%EA%B8%B0

 

Springboot Log 남기기

우선 Log를 사용하기 전에 무엇인지부터 알아보자. 1. Log란? 사전적 의미로는 It에서 발생되는 모든 행위와 이벤트 정보를 시간에 따라 남겨둔 데이터를 지칭한다. 간단하게 이야기하면, 로그는

dingdingmin-back-end-developer.tistory.com

https://loki4j.github.io/loki-logback-appender/#quick-start

 

Loki4j Logback · Pure Java Logback appender for Grafana Loki

Pure Java Logback appender for Grafana Loki

loki4j.github.io

https://ict-nroo.tistory.com/95

 

[Spring Boot] 스프링 부트 로깅(기본 로깅, 커스텀 로깅)

백기선 - 스프링 부트 개념과 활용5-1. 기본 로깅커밋로그기본 로깅 설정스프링 부트는 기본적으로 로깅 파사드 Commons Logging을 사용한다. 결국 SLF4j를 사용하게 된다. 소스코드에서도 SLF4j를 사용

ict-nroo.tistory.com

https://mark-kim.blog/history_of_java_logging/

 

자바 로깅 프레임워크 히스토리 이해하기

자바는 Log4j, Logback, JUL, JCL 및 slf4j등등 많은 프레임워크가 존재해서 주변 개발자를보면 대부분 로그 관련하여 굉장히 혼란스러워한다. 이번 글은 이러한 자바 로깅 프레임워크의 역사에 대해서

mark-kim.blog

https://namu.wiki/w/Log4j%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%82%AC%ED%83%9C#s-6.4

 

Log4j 보안 취약점 사태

Log4j의 취약점을 보도한 KBS 의 기사 CVE-2021-44228 Log4Shell 혹은 LogJam이라고

namu.wiki