컴퓨팅에서 로그파일은 운영 체제나 다른 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어 간의 메시지를 기록한 파일이다. 로그를 기록하는 행위는 로깅이라고 한다.
로그에는 여러 종류가 있다. OS 내 시스템 로그, FW 방화벽 로그, 인증 로그 등 다양한데 이 글에서 다룰 로그는 프로젝트 내 로그, 즉 어플리케이션 로그다. 개발을 하다보면 손쉬운 디버깅, 정보 제공을 위해 변수, 실행 값을 로깅할 필요가 있다. spring도 예외는 아니다. spring은 log4j와 logback을 통해 로깅기능을 제공한다. Log4j, Logback을 검색하면 항상 연관검색어에 뜨는 내용이 있는데 그것은 SLF4J다. SLF4J 개똥 같은 이름인데 얘부터 뭔지 알아보자
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으로 의존성만 바꿔주면 그대로 사용가능하다는 얘기다.
👁 한마디로 필수는 아니지만 똥꼬쇼하기 싫으면 되도록 같이 적용하는게 좋을 것이다. Log4j, Logback, Log4j2 등 로그 라이브러리가 나올 때마다 SLF4J와 연동이 가능하기 떄문에 앞으로도 로깅 라이브러리가 나오면 얘랑 결합 가능한 형태일 것이다. 구 버전 로깅 라이브러리는 시간이 갈 수록 추가적인 취약점도 나오는 만큼 언제든 변경가능한 구조로 만들어 놓는 것이 현명하다 생각한다.
찾아보면 잘 정리해둔 글들이 많다. 내가 찾아보기 편하도록 글에 작성한다.
https://livenow14.tistory.com/63
다른 로깅 API로의 Logger 호출을 SLF4J 인터페이스로 리다이렉트하여 SLF4J API가 대신 처리할 수 있도록 일종의 어댑터 역할을 하는 라이브러리다. 거의 메인인 녀석
로깅에 대한 추상 레이어를 제공한다. 추상 메소드를 제공하기 때문에 각 API별 Binding을 통해 사용해야 한다.
SLF4J 인터페이스를 Logging Framework와 연결하는 어댑터 역할을 하는 라이브러리로
SLF4J API를 구현한 클래스에서 Binding으로 연결될 Logger의 API를 호출한다.
Log4j는 Ceki Gülcü가 처음 개발한 자바 기반 로깅 유틸리티이다. 아파치 소프트웨어 재단의 프로젝트 아파치 로깅 서비스(Apache Logging Services)의 일부이다. 또, Log4j는 여러 자바 로깅 프레임워크들 가운데 하나이다. 최종 사용자가 제품의 문제나 정보를 식별하기 위해, 그리고 소프트웨어 개발자가 프로그램을 개발하는 도중에 디버깅 등을 위해 타임스탬프 등 정해진 양식에 맞추어 화면 상이나 파일로 로그를 남길 목적으로 사용된다.
가장 보편적으로 사용되었던 Log4j다. 하지만 2015년에 개발이 중단되었기 때문에 기존 시스템이 아니라면 사용할 이유가 없다.
log4j는 세가지로 구성되어 있다.
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들로 구성되어있다.
Apache Log4j 2는 이전 버전인 Log4j 1.x에 비해 상당한 개선 사항을 제공하고 Logback 아키텍처에 내재된 몇 가지 문제를 수정하면서 Logback에서 사용할 수 있는 많은 개선 사항을 제공하는 Log4j에 대한 업그레이드 버전이다.
한마디로 Log4j의 업그레이드 버전이다. log4j > logback > log4j2 순으로 만들어졌으며 log4j2는 다중 스레드 시나리오에서 비동기식 로거는 Log4j 1.x 및 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다고 한다.
오늘은 로깅의 개념과 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