Java - SLF4J란?

logging

Posted by Yan on November 14, 2021

로그를 남긴다는 것? 시스템 운영에 대한 기록을 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의 디렉토리 서비스를 위한 다양한 인터페이스 중 하나

reference

[Logging] SLF4J란? > Log4j 보안 취약점 사태