스프링에서는 따로 설정하지 않는한 기본적으로 Apache의 Jakarta Common Logging(줄여서 JCL) 을 사용합니다.
참고 경로 -> commons.apache.org

그러나 여기서 알아야 할 점 한가지가 있는데, JCL은 JDBC API와 같은 단순한 인터페이스 기능을 한다는 것입니다. 즉 JCL API를 구현하는 구현체 라이브러리가 있어야만 동작하는데, 대표적인 JCL 구현체로 log4j가 있습니다.


즉 위와 같은 모습으로 스프링 내부적으로는 JCL API를 사용하지만 실제로 그 아래 동작하는것은 Log4J같은 구현체인 것입니다. Log4J라이브러리를 빼고 대신에 다른 JCL 구현체 라이브러리를 스프링 어플리케이션에 끼워넣어주면 해당 로깅 프레임워크가 동작하는 방식입니다.





Logback과 slf4J 그리고 브릿지(bridge)
위의 그림에서처럼 스프링은 실질적으로 Log4J가 동작한다는 사실을 모르는채 JCL을 통해 로깅을 수행하고 있다고 생각할것입니다. 여기서 한가지 더 문제가 발생합니다. 지금 우리가 설정하려는 logback은 스프링이 사용하는 JCL이 아닌 slf4j의 구현체라는 사실입니다.




따라서 Log4J를 Logback으로 대체하여 사용하고 싶어도 Spring의 .jar 파일들을 열어서 JCL을 통해 로깅을 수행하는 소스를 모두 수정해주지 않는 이상은 교체가 불가능합니다.




이러한 문제 해결을 위해 SLF4J에서는 자체적으로 여러가지 브릿지를 제공하는데 어쩌구저쩌구-over-slf4j.jar 가 그러한 브릿지 라이브러리들입니다. 로깅 프레임워크 종류가 워낙 다양하니 많이 사용하는 로깅 프레임워크에 대한 중간다리(어댑터) 역할을 지원하는것입니다. 예를 들어 JCL과 SLF4J를 이어주는 jcl-over-slf4j가 있습니다.







스프링의 로그기능을 Logback으로 설정하기
사실 스프링의 JCL을 로그백으로 설정하는 방법이 크게 있는것은 아닙니다. 지금까지 설명했던 내용들이 이해되셨다면 방법은 매우 단순합니다. 몇가지 라이브러리를 추가해 주면 되는것입니다. 메이븐을 기준으로 설명하자면 다음과 같습니다.

1. 기존에 사용하던 commons-logging<exclusions> 를 통해 빌드목록에서 제외시켜줍니다.
     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.0.RELEASE</version>
           <exclusions>
                <exclusion>
                     <groupId>commons-logging</groupId>
                     <artifactId>commons-logging</artifactId>
                </exclusion>
           </exclusions>
     </dependency>
cs


2. logback을 사용해야 하니 당연히 logback을 라이브러리에 추가해 주어야 합니다. 메이븐 특성상 의존하는 라이브러리도 자동으로 내려받으니 logback을 메이븐 의존성에 추가하면 logback이 구현하고 있는 인터페이스인 slf4-api도 자동으로 내려받아 빌드목록에 추가됩니다.
     <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.0.13</version>
     </dependency>
cs


3. JCL과 SLF4의 브릿지(어댑터) 역할을 수행할 jcl-over-slf4j를 메이븐 의존성에 추가하여 빌드 목록에 추가합니다.
     <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>jcl-over-slf4j</artifactId>
           <version>1.7.5</version>
     </dependency>
cs


4. 최종 메이븐 의존성 설정 <dependencies> 는 다음과 같습니다.
<dependencies>
     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.0.RELEASE</version>
           <exclusions>
                <exclusion>
                     <groupId>commons-logging</groupId>
                     <artifactId>commons-logging</artifactId>
                </exclusion>
           </exclusions>
     </dependency>
     <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.0.13</version>
     </dependency>
     <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>jcl-over-slf4j</artifactId>
           <version>1.7.5</version>
     </dependency>
</dependencies>
cs


5. logback 관련 설정은 스프링이나 일반 자바 어플리케이션이나 다른점이 없습니다. classpath 경로(ex: src/main/resources)에 logback.xml을 추가하고 기존과 똑같이 사용하면 됩니다.
Logger logger = LoggerFactory.getLogger(LoggerTest.class);
logger.info("info");
cs

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!