복붙노트

[SPRING] 단순히 pom.xml에 slf4j를 추가하면 log4j가 어떻게 래핑됩니까?

SPRING

단순히 pom.xml에 slf4j를 추가하면 log4j가 어떻게 래핑됩니까?

예제 스프링 pom.xml 파일에서 본 것은 slf4j 및 log4j에 대한 몇 가지 항목을 추가하고 spring 어플리케이션에서 log4j를 사용하면 slf4j 라이브러리로 래핑됩니다.

누군가이 마법 같은 일이 어떻게 일어 났는지 설명 할 수 있습니까?

해결법

  1. ==============================

    1.Spring은 여전히 ​​모든 내부 로깅을 위해 commons-logging을 사용합니다 (하위 호환성). 다른 로깅 프레임 워크 (log4j)를 사용하려면 commons logging에서 선택 프레임 워크로 호출을 연결해야합니다. 그렇지 않으면 여러 로깅 구성을 유지 관리해야합니다.

    Spring은 여전히 ​​모든 내부 로깅을 위해 commons-logging을 사용합니다 (하위 호환성). 다른 로깅 프레임 워크 (log4j)를 사용하려면 commons logging에서 선택 프레임 워크로 호출을 연결해야합니다. 그렇지 않으면 여러 로깅 구성을 유지 관리해야합니다.

    slf4j는 다양한 로깅 프레임 워크 (jul, log4j, jcl, logback)에 대한 간단한 외관 역할을하며 배포시 원하는 로깅 프레임 워크에 플러그인 할 수 있습니다.

    써드 파티 프레임 워크에 의해 부과 된 로깅 프레임 워크 구현을 사용하는 대신 slf4j의 브리지 구현을 제공합니다. 실제로는 로깅 호출을 slf4j 또는 콘크리트 바인딩으로 전달합니다.

    Maven pom.xml의 Logging 섹션은 보통 다음과 같이 보입니다 :

    <!-- remove the real commons-logging from classpath -->
    <!-- declare as provided or exclude from spring jars -->
    <dependency>
        <artifactId>commons-logging</artifactId>
        <groupId>commons-logging</groupId>
        <version>1.0</version>
        <scope>provided</scope>
    </dependency>
    
    <!-- add slf4j interfaces to classpath -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.4</version>
        <scope>compile</scope>
    </dependency>
    
    <!-- add commons logging to slf4j bridge to classpath --> 
    <!-- acts as jcl but routes commons-logging calls to slf4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.6.4</version>
        <scope>runtime</scope>
    </dependency>
    
    <!-- add log4j binding to classpath -->
    <!-- routes slf4j calls to log4j -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
        <scope>runtime</scope>
    </dependency>
    
    <!-- add log4j to classpath -->
    <!-- does the logging -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>
    

    이것은 Spring Container 나 Dependency Injection과는 아무런 상관이 없으며 순수한 클래스 패스, 클래스 로더 등이다.

    자세한 내용은 다음 링크를 참조하십시오.

  2. ==============================

    2.slf4j는 로깅 API입니다. 아무 것도하지 않고 단지 인터페이스 만 있습니다. log4j는 구체적인 클래스가있는 로깅 시스템입니다. log4j를 slf4j API의 백엔드로 사용하는 slf4j-log4j 라이브러리가 있습니다.

    slf4j는 로깅 API입니다. 아무 것도하지 않고 단지 인터페이스 만 있습니다. log4j는 구체적인 클래스가있는 로깅 시스템입니다. log4j를 slf4j API의 백엔드로 사용하는 slf4j-log4j 라이브러리가 있습니다.

    어떤 프로젝트는 log4j에 명시 적으로 의존하며, 구체적인 클래스를 호출합니다. 따라서 slf4j API 만 사용하여 현명하게 만든 프로젝트에 다른 백엔드 (예 : logback 또는 j.u.l 또는 apache commons 등)를 사용할 수 없습니다.

    log4j 클래스를 모의 구현 (브리지)으로 대체하여 모든 호출을 sl4j로 간단히 리디렉션하는 트릭이 있습니다. Maven에서는 매우 높은 버전 번호의 의존성을 선언하고이 모의 작업을 초 현대식 log4j 라이브러리로 간주합니다.

  3. from https://stackoverflow.com/questions/8670069/how-does-simply-adding-slf4j-to-the-pom-xml-wrap-log4j by cc-by-sa and MIT license