로그를 남긴다는 것? 시스템 운영에 대한 기록을 Log형태로 파일에 저장해 관리하는 것이다.
로깅의 목적
- 디버깅, 시스템 에러 추적, 성능, 문제점 향상 등을 위해 사용
- 너무 적은 로그는 정확한 시스템 상황을 파악하기 어렵게 한다.
- 너무 많은 로그는 파일IO로 인해 오버헤드와 로그 파일의 백업 문제 등 파생 문제가 발생할 가능성이 있다.
SLF4J Simple Logging Facade For Java
- 다양한 로깅 프레임워크에 대한 추상화(인터페이스) 역할을 하는 라이브러리
- 추상 로깅 프레임워크이기 때문에 단독으로 사용하지 않는다.
- 최종 사용자가 배포시 원하는 로깅 프레임워크를 결정하고 사용해도, SLF4J가 인터페이스화되어 있기 때문에 SLF4J에 의존하는 클라이언트 코드에서는 실제 구현을 몰라도 된다. (의존관계 역전)
동작 과정
- 개발할 때 SLF4J API를 사용해 로깅 코드 작성
- 배포할 때 바인딩된 Logging Framework가 실제 로깅 코드 작성
Logger 사용하기
Java.util.logging
- severe, warning, info, config, fine, finer, finest의 로그 레벨 제공
- 오픈 소스로 log4j를 많이 사용한다.
1
2
3
4
5
6
7
public class TestClass() {
private final Logger LOGGER = LoggerFactory.getLogger(TestClass.class.getName());
public void test() {
LOGGER.info("Hello world!");
}
}
-
getLogger(String) 메소드는 싱글톤 패턴으로, 해당 String을 기반으로 호출했을 때 고유한 Logger 객체를 반환해준다.
-
log4j2.xml을 생성하고 내가 로그를 찍을 클래스의 경로를 입력한다.
Log4j 보안 취약점
- Log4j: Java, Kotlin, Scala, Groovy 코딩 중 프로그램의 로그를 기록해주는 라이브러리. 프로그램 실행시 지정한 경로에 자동으로 로그를 저장해준다.
취약점
-
JNDI
(Java Naming and Directory Interface): 자바 프로그램이 디렉토리를 통해 데이터를 찾을 수 있도록 하는 디렉토리 서비스 -
LDAP
: JNDI의 디렉토리 서비스를 위한 다양한 인터페이스 중 하나