[ SLF4J와 Log4j, Logback ]

carrotsman·2023년 1월 23일
1

백엔드

목록 보기
5/6
post-thumbnail

로깅

컴퓨팅에서 로그파일은 운영 체제나 다른 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어 간의 메시지를 기록한 파일이다. 로그를 기록하는 행위는 로깅이라고 한다.

로그에는 여러 종류가 있다. OS 내 시스템 로그, FW 방화벽 로그, 인증 로그 등 다양한데 이 글에서 다룰 로그는 프로젝트 내 로그, 즉 어플리케이션 로그다. 개발을 하다보면 손쉬운 디버깅, 정보 제공을 위해 변수, 실행 값을 로깅할 필요가 있다. spring도 예외는 아니다. spring은 log4j와 logback을 통해 로깅기능을 제공한다. Log4j, Logback을 검색하면 항상 연관검색어에 뜨는 내용이 있는데 그것은 SLF4J다. SLF4J 개똥 같은 이름인데 얘부터 뭔지 알아보자


SLF4J (Simple Logging Facade for Java)

SLF4J(Simple Logging Facade for Java)는 단순한 퍼사드 패턴을 수단으로 하는 자바 로깅 API를 제공한다. 기반이 되는 로깅 백엔드는 원하는 바인딩을 클래스패스에 추가함으로써 런타임 시점에 결정되며 표준의 썬 자바 패키지 java.util.logging, log4j, reload4j, logback, tinylog가 될 수 있다.

이번에도 간지나는 말로 설명되있다. 그냥 간단히 정리해준다. 얘는 추상객체다. 한마디로 이 녀석만으로는 사용할 수 없다는 얘기다. Log4J나 Logback같은 라이브러리와 결합하여 SLF4J 방식으로 로그를 남길 수 있다. 이것이 갖는 강점이 뭐겠는가? 당신이 Log4J로 구축된 프로젝트 로깅을 Logback으로 바꾼다 가정해보자. Log4J로만 구축된 경우 Log4J문법에서 Logback문법으로 전부 바꿔줘야 될 것이다. 하지만 이를 감싸고 있는 SLF4J가 있다면? Log4J에서 Logback으로 의존성만 바꿔주면 그대로 사용가능하다는 얘기다.

  • 🤞 기존 spring은 JCL(Jakarta Commons Logging) 을 활용하여 로깅을 구현했다.
    Log, LogFactory를 사용해 커스텀 로깅을 구현하는 한편, 클래스 로더 의존적이며, (GC)가비지 컬렉션이 제대로 작동하지 않는 치명적인 오류가 있었다. 때문에 컴파일 시점에 구현체를 선택할 수 있는 SLF4J가 도입되었다. Bridging, API, Binding 모듈을 제공하여 컴파일 시점에 로깅 구현체를 결정한다. 또한 기타 로깅 라이브러리를 패킹하는 역할로 널리 사용된다.

👁 한마디로 필수는 아니지만 똥꼬쇼하기 싫으면 되도록 같이 적용하는게 좋을 것이다. Log4j, Logback, Log4j2 등 로그 라이브러리가 나올 때마다 SLF4J와 연동이 가능하기 떄문에 앞으로도 로깅 라이브러리가 나오면 얘랑 결합 가능한 형태일 것이다. 구 버전 로깅 라이브러리는 시간이 갈 수록 추가적인 취약점도 나오는 만큼 언제든 변경가능한 구조로 만들어 놓는 것이 현명하다 생각한다.


SLF4J 동작 과정

찾아보면 잘 정리해둔 글들이 많다. 내가 찾아보기 편하도록 글에 작성한다.
https://livenow14.tistory.com/63

  • 개발할 때, SLF4J API를 사용하여 로깅 코드를 작성
  • 배포할 때, 바인딩된 Logging Framework가 실제 로깅 코드를 수행

    SLF4J에서 제공하는 3가지 모듈을 통해 수행한다.

1. SLF4J Bridging Modules

다른 로깅 API로의 Logger 호출을 SLF4J 인터페이스로 리다이렉트하여 SLF4J API가 대신 처리할 수 있도록 일종의 어댑터 역할을 하는 라이브러리다. 거의 메인인 녀석

2. SLF4J API (인터페이스)

로깅에 대한 추상 레이어를 제공한다. 추상 메소드를 제공하기 때문에 각 API별 Binding을 통해 사용해야 한다.

3. SLF4J Binding

SLF4J 인터페이스를 Logging Framework와 연결하는 어댑터 역할을 하는 라이브러리로
SLF4J API를 구현한 클래스에서 Binding으로 연결될 Logger의 API를 호출한다.


Log4j (Log for java)

Log4j는 Ceki Gülcü가 처음 개발한 자바 기반 로깅 유틸리티이다. 아파치 소프트웨어 재단의 프로젝트 아파치 로깅 서비스(Apache Logging Services)의 일부이다. 또, Log4j는 여러 자바 로깅 프레임워크들 가운데 하나이다. 최종 사용자가 제품의 문제나 정보를 식별하기 위해, 그리고 소프트웨어 개발자가 프로그램을 개발하는 도중에 디버깅 등을 위해 타임스탬프 등 정해진 양식에 맞추어 화면 상이나 파일로 로그를 남길 목적으로 사용된다.

가장 보편적으로 사용되었던 Log4j다. 하지만 2015년에 개발이 중단되었기 때문에 기존 시스템이 아니라면 사용할 이유가 없다.

구조

log4j는 세가지로 구성되어 있다.

  • Logger : 로깅을 수행하는 구성요소로 Level 속성을 통해서 출력할 로그의 레벨을 조절할 수 있다.
  • Appender : 로그 메시지가 출력될 대상을 결정하는 요소
  • Layout : 로깅 정보를 포멧팅

특징

  • 속도와 유연성을 고려하여 디자인되었으며, 속도에 최적화 되어 있다.
  • 멀티스레드 환경에서 사용해도 안전하다.
  • 계층적인 로그 설정과 처리를 지원한다.
  • 출력을 파일, 콘솔, java.io.OutputStream, java.io.Writer, TCP를 사용하는 원격서버, 원격 Unix Syslog 데몬, 원격 JMS 구독자, 윈도우NT EventLog로 보낼 수 있고, 심지어는 e-mail 로 보낼 수도 있다.
  • 계층적인 6가지의 로그 메시지 레벨을 사용한다. (TRACE < DEBUG < INFO < WARN < ERROR < FATAL)

Logback

log4j보다 안정성이 높고 편리하게 log를 관리하기 위해 Logging framework인 Slf4j(Simple Logging Façade for Java)와 그 구현체로써 Logback이 고안되었다.

log4j를 토대로 새롭게 만든 Logging 라이브러리다. slf4j를 통해 연관 라이브러리들이 다른 logging framework를 쓰더라도 logback으로 통합할 수 있다. Logback을 이용하여 로깅을 수행하기 위해서 필요한 주요 설정요소로는 Logger, Appender, Encoder의 3가지가 있으며 각각은 다음과 같은 역할을 수행한다.

구조

Logback을 사용하기 위해서는 다음과 같은 tag들로 구성되어있다.

  • Logger : 로깅을 수행하는 구성요소로 Level 속성을 통해서 출력할 로그의 레벨을 조절할 수 있다.
  • Appender : 로그 메시지가 출력될 대상을 결정하는 요소 (console / file / DB appender)
  • Encoder : Appender에 포함되어 사용자가 지정한 형식으로 표현 될 로그메시지를 변환하는 역할을 담당하는 요소

특징

  • log4j보다 약 10배 정도 빠르게 수행되도록 내부가 변경되었으며, 메모리 효율성도 좋아졌다.
  • 설정 파일을 변경하였을 경우, 서버 재기동 없이 변경 내용이 자동으로 갱신된다.
  • 서버 중지 없이 I/O Faliure에 대한 복구를 지원한다.
  • RollingFileAppender를 사용할 경우 자동적으로 오래된 로그를 지워주며 Rolling 백업을 처리한다.

Log4j2

Apache Log4j 2는 이전 버전인 Log4j 1.x에 비해 상당한 개선 사항을 제공하고 Logback 아키텍처에 내재된 몇 가지 문제를 수정하면서 Logback에서 사용할 수 있는 많은 개선 사항을 제공하는 Log4j에 대한 업그레이드 버전이다.

한마디로 Log4j의 업그레이드 버전이다. log4j > logback > log4j2 순으로 만들어졌으며 log4j2는 다중 스레드 시나리오에서 비동기식 로거는 Log4j 1.x 및 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다고 한다.

특징

  • API 분리 (Logback과 같은 다른 로깅 구현 앞에 사용될 수도 있다.)
  • 향상된 성능 (기존 로깅 대비 18배 빠른 성능)
  • 서버 재기동 없이 변경 내용이 자동으로 갱신된다.
  • 뭐 등등등 Logback의 좋은 점은 다 흡수했다고 한다.

정리하며

오늘은 로깅의 개념과 SLF4J와 구현체 Log4j, Logback에 대해 알아봤다. 검색해보면 샘플은 넘치고 넘친다. 가장 최근에 나온 Log4j2와 SLF4J를 활용해 로깅시스템을 구축하는게 현명해보인다. 얘도 취약점 안나오리라는 보장은 없기 때문이다. 매일같이 이력서를 갱신하는 우리네의 마음처럼 언제든 갈아낄 수 있도록 준비해놓자 후후

오늘 저녁은 핫도그다. 🥕


참고 : https://codingnotes.tistory.com/72
https://velog.io/@mindfulness_22/slf4j-slf4j-logback-3
https://dkswnkk.tistory.com/445
https://pakss328.medium.com/log4j%EC%97%90%EC%84%9C-log4j2-migration-3fe5c77ca32
https://jeonyoungho.github.io/posts/Log4j%EC%99%80-Logback%EA%B3%BC-Log4j2%EC%9D%98-%EC%B0%A8%EC%9D%B4/
https://junshock5.tistory.com/124
https://goddaehee.tistory.com/45
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mk1126sj&logNo=220970218433

profile
당근먹고 강력한 개발

0개의 댓글