logo

Log4j 대 SLF4J

SLF4J(Java용 Simple Logging Facade) log4j가 그 중 하나인 많은 로깅 프레임워크에 대한 일반적인 액세스를 제공하도록 설계된 API입니다.

기본적으로 추상화 계층입니다. 로깅 구현이 아닙니다. 이는 라이브러리를 작성 중이고 SLF4J를 사용하는 경우 해당 라이브러리를 다른 사람에게 제공하여 사용하도록 할 수 있으며 SLF4J와 함께 사용할 로깅 구현(예: log4j 또는 Java 로깅 API)을 선택할 수 있다는 의미입니다. 애플리케이션이 종속된 라이브러리를 사용하는 것처럼 애플리케이션이 다른 로깅 API에 종속되는 것을 방지하는 데 사용됩니다.

그러나 우리는 단 한 줄의 답변만 받을 수 있는 Log4J와 SLF4J의 차이점을 자세히 설명합니다. 즉, 질문 자체가 잘못되었습니다. SLF4J와 Log4J는 서로 다르거나 유사한 구성요소가 아닙니다. 지정된 이름처럼 SLF4J는 Java에 대한 간단한 로깅 외관입니다. 이는 로깅 구성요소가 아니며 실제 로깅을 수행하지도 않습니다. 이는 기본 로깅 구성 요소에 대한 추상화 계층일 뿐입니다.

의 경우 Log4j , 이는 로깅 구성 요소이며 지시된 로깅을 수행합니다. 따라서 SLF4J와 Log4J는 논리적으로 서로 다른 두 가지라고 말할 수 있습니다.

Log4j 대 SLF4J

이제 런타임에 사용해야 하는 로깅 프레임워크만 선택하면 됩니다. 이를 위해서는 두 개의 jar 파일을 포함해야 합니다.

  • SLF4J 바인딩 jar 파일
  • 원하는 로깅 프레임워크 jar 파일

예를 들어 프로젝트에서 log4j를 사용하려면 아래 jar 파일을 포함해야 합니다.

  • slf4j-log4j12-1.7.12.jar
  • log4j-1.2.17.jar

애플리케이션 클래스 경로에 두 jar 파일을 모두 배치하면 SLF4J는 이를 자동으로 감지하고 log4j 구성 파일에 제공한 구성을 기반으로 로그 문을 처리하기 위해 log4j를 사용하기 시작합니다.

예를 들어 아래 코드를 프로젝트 클래스 파일에 작성할 수 있습니다.

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info('Hello World'); } } 

SLF4J가 Log4J보다 나은 이유는 무엇입니까?

SLF4J와 Log4j 중 하나를 선호하는 것은 항상 어렵습니다. 당신에게 선택권이 있다면 나는 당신에게 제안하고 싶습니다. 로깅 추상화는 항상 로깅 프레임워크보다 선호됩니다. 특히 SLF4J와 같은 로깅 추상화를 사용하는 경우 단일 종속성을 선택하지 않고도 배포 시 필요한 모든 로깅 프레임워크로 마이그레이션할 수 있습니다.

Log4j 대신 SLF4J를 선택하기에 충분한 이유는 다음과 같습니다.

  • 항상 추상화를 사용하는 것이 좋습니다.
  • SLF4J는 특정 로깅 구현과 독립적인 오픈 소스 라이브러리 또는 내부 라이브러리입니다. 즉, 여러 라이브러리에 대한 여러 로깅 구성을 관리할 필요가 없습니다.
  • SLF4J는 자리 표시자 기반 로깅을 제공하여 isInforEnabled(), isDebugEnabled() 등과 같은 검사를 제거하여 코드의 가독성을 향상시킵니다.
  • SLF4J의 로깅 방법을 사용하여 필요할 때까지 로깅 메시지(문자열) 구성 비용을 연기합니다. 이는 CPU와 메모리 모두 효율적입니다.
  • SLF4J는 더 적은 수의 임시 문자열을 사용하므로 가비지 수집기에 대한 작업이 적어지며 이는 애플리케이션의 처리량과 성능이 향상됨을 의미합니다.

따라서 본질적으로 SLF4J는 log4j를 대체하지 않습니다. 둘 다 함께 일합니다. 이는 애플리케이션에서 log4j에 대한 종속성을 제거하고 나중에 이를 보다 유능한 라이브러리로 쉽게 교체할 수 있게 해줍니다.