개발 환경에서는 단순하게 postman으로 요청을 보내 확인하거나, test code 작성으로 동작을 확인할 수 있다.
그러면 배포 환경에서의 동작은 어떻게 확인할 수 있을까?
이때가 로깅을 사용해야 할 떄이다.
Spring에서는 로그를 system.out.println()이나 로깅 프레임워크로 남길 수 있다.
출력 형식 지정
-> spring과 logback 구현체를 사용하는 경우, logback-spring.xml 파일을 작성하여 출력 형식을 세주벅으로 지정할 수 있다.
로그 레벨 지정
-> 5가지 로그 레벨을 사용할 수 있다.
콘솔이 아닌 파일이나 네트워크에도 넘길 수 있다.
-> system.out.println()에서는 콘솔에만 로그를 남길 수 있는 반면, 로깅 프레임워크에서는 파일이나 네트워크에도 로그를 남길 수 있다.
로깅 프레임워크 보다 system.out.println()의 성능이 더 좋다.
debug을 사용할 수 없는 상황에서는 로깅이 최선의 선택이다
ex) 실 서버 구동중
디버깅을 쓸 수 있는 환경이라면 디버깅을 사용하는 것이 디버깅을 사용하는 것이 더 좋다.(더 자세하기 로그들을 확인할 수 있기 때문에)
다양한 로깅 프레임워크에 대한 추상화 인터페이스 역할
SLF4J는 추상 로깅 프레임워크이기 때문에 단독으로 사용할 수 없다.
최종 사용자가 배포시 원하는 로깅 프레임워크를 설정하고, 사용해도 SLF4J가 인터페이스화 되어 있기 때문에 SLF4J를 의존하는 클라이언트 코드에서는 실제 구현을 몰라도 되는 장점이 있다. (DIP 법칙)

SLF4J 이외의 다른 로깅 API로의 Logger 호출을 SLF4J 인터페이스로 redirect해 SLF4J가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리
이전의 레거시 로깅 프레임워크를 위한 라이브러리와의 호환성을 유지해주는 역할하며, 다른 로깅 프레임워크들을 통합해 사용할 수 있도록 도와준다.
ex) Log4j를 사용하다가 Logback로 로깅 프레임워크를 변경해 진행했다면, 기존의 import와 의존성들을 모두 변경해야 하는데, Bridge를 통해 변경 없이 새로운 로깅 프레임워크와도 호환성을 유지 시켜준다.
-> 다른 로깅 API로의 Logger 호출을 SLF4J API로 연결해주기 때문에 가능하다!
주의할 점 : Binding 모듈에서 사용될 프레임워크와 Bridge로 요청을 보낼 프레임워크가 서로 달라야 한다.
로깅에 대한 인터페이스를 제공한다.
로깅 동작에 대한 역할을 수행할 추상 메소드를 제공한다.
주의할 점 : 하나의 API 모듈에 하나의 Binding 모듈을 둬야한다.
ex) logback-classic
SLF4J와 구현체를 연결하는 어댑터 역할을 하는 모듈이다.
SLF4J API를 로깅 구현체(로깅 프레임워크)와 연결한다.
SLF4J를 구현한 클래스에서 Binding으로 연결된 Logger의 API를 호출한다.
ex) logback-core
주의할 점 : 하나의 API 모듈에 하나의 Binding 모듈을 둬야한다.
Log4j 를 토대로 만든 프레임워크
SLF4J의 구현체
로깅 구현체의 종류 중 하나로 스프링부트가 디폴트로 사용하는 라이브러리

Logback은 3가지 모듈로 나뉜다.
다른 두 모듈을 위한 기반 역할을 하는 모듈
Appender와 Layout 인터페이스가 여기에 속한다.
logback-core에서 확장된 모듈로 logback-core를 가지고 SLF4J API를 구현한다.
Logger 클래스가 여기에 속한다.
Servlet 컨테이너와 통합되어 HTTP 액세스에 대한 로깅 기능을 제공한다.
logback-core는 logback-access의 기반기술이기에 필요하지만, logback-classic과 SLF4J와는 무관하다.
웹 애플리케이션 레벨이 아닌 컨테이너 레벨에서 설치되어야 한다.

실제 로깅을 수행하는 구성요소
출력 레벨 : TRACE > DEBUG > INFO > WARN > ERROR
Logback은 로그 이벤트를 쓰는 작업을 Appender에게 위임한다.
로그 메시지가 출력될 대상을 결정하는 요소
consoleAppender, FileAppender, RollingFileAppender 등이 존재한다.
로그 이벤트를 바이트 배열로 변환하고, 해당 바이트 배열을 OutputStream에 쓰는 작업을 담당한다.
Appender에 포함되어 사용자가 지정한 형식으로 표현될 로그 메시지를 변환하는 역할을 담당하는 요소
FileAppender와 하위 클래스는 encoder를 필요로 하고, 더이상 layout은 사용하지 않기에 이제는 layout보다는 Encoder을 사용한다.
유익한 글이었습니다.