Index
- SLF4J 키워드 및 개념
- SLF4J 동작원리 및 특징
- log4j2 & 사용한 방식
Log
Facade
SLF4J는 3가지 모듈을 제공합니다. ( API, Binding, Bridging)
각 모듈은 다음과 같은 기능을 합니다.
1) SLF4J API
2) SLF4jJ Binding
3) SLF4J Bridging
#cf) 로깅시, Systme.out.println() 을 사용 해도 될까?? 에 대한 설명입니다.
println() 메소드를 타고 들어가서 내부가 어떻게 도는지 확인해보겠습니다.
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
synchronized 키워드를 사용하기 때문에, 멀티쓰레딩 환경에서 여러곳에서 System.out.println()을 사용할 경우 성능저하의 큰 문제가 될 수 있습니다.
저는 가장 최신 버전인 log4J2를 활용하여 어플리케이션에 필요한 로깅방식을 취하기로 하였습니다.
그 이유로는 다음과 같습니다. ( springBoot 내장된 것은 logback이여 조금 번거롭지만, 사용해보았습니다.)
우선 배포버전, 개발버전을 나누어서 로깅방식을 채택하였습니다.
개발 시에는, 로그파일을 따로 관리할 필요가 없었기에 프로젝트 빌드 시, 환경변수를 주어서, log4j2 프레임워크를 바인딩 될 수 있도록 하였습니다.
ex) 예시
//log4j2
ext.profile = (!project.hasProperty('profile') || !profile) ? 'local' : profile
if (ext.profile == 'prod' || ext.profile=='packaging') {
implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.17.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.17.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.17.1'
implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.17.1'
implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32'
implementation group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.32'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
}
배포 시
#cf) 최근 보안이슈가 있었기 때문에 버전을 잘 확인하셔야 합니다.
문제가 되었던 부분
이슈의 이름: CVE-2021-44228
이슈 내용:
log4j2를 이용하여, 원격 코드 실행 가능한 JNDI 인젝션 취약점으로, 사용자의 입력으로 발생한 로그를 기록할 때 해커의 임의코드 실행이 가능하게 된다는 점입니다.
즉 해커가 악용한다면 서버에 접근하는 것 만으로 사용자의 컴퓨터를 사실상 원격 조정할 수 있다고 한다.
2.15 이전의 버전들은 사용하면 안된다고 합니다!! (아래글을 참조하세요)
Log4J2 Vulnerability and Spring Boot
https://livenow14.tistory.com/63
https://gmlwjd9405.github.io/2019/01/04/logging-with-slf4j.html
https://www.slideshare.net/whiteship/ss-47273947