Springboot SL4j vs Log4j2, 로깅 라이브러리 설정

devdo·2022년 10월 19일
1

SpringBoot

목록 보기
29/35

Log4J와 SLF4J는 둘 다 자바 애플리케이션에서 많이 사용되는 로깅 프레임워크입니다. 하지만 몇 가지 주요 차이점이 있습니다:

Log4J

  • 출처: Apache Software Foundation에서 개발.

  • 사용법: 애플리케이션에서 직접 로깅을 위해 사용.

  • 구성: XML 또는 JSON 파일을 사용하여 설정.

  • 성능: 일반적으로 빠르고 효율적.

  • 인기도: 널리 사용되며 잘 문서화됨.


SLF4J (Simple Logging Facade for Java)

  • 출처: QOS.ch에서 개발.

  • 사용법: 다양한 로깅 프레임워크(Log4J 포함)를 위한 추상화 계층(인터페이스)으로 작동.

  • 구성: 보통 기본 로깅 프레임워크를 통해 설정(Log4J, JUL 등).

  • 유연성: 코드 변경 없이 다양한 로깅 프레임워크로 전환 가능.

  • 인기도: 유연성과 사용 용이성 때문에 매우 인기가 높음.

요약하자면, 단순한 로깅 솔루션이 필요하다면 Log4J가 좋은 선택입니다. 유연성과 다양한 로깅 프레임워크로 전환할 수 있는 능력을 선호한다면 SLF4J가 더 적합합니다.


== 예전글
Java Spring Boot에서 로깅을 위한 가장 인기있는 라이브러리는 Logback, Log4j2, 그리고 Java Util Logging (JUL)입니다.

이 중에서는 Logback이 가장 많이 사용되며,(현재는 log4j2를 많이 사용하는 것 같습니다.) Spring Boot에서도 기본적으로 Logback을 지원합니다.

순서
log4j (보안 취약점 발견) > Logback > Log4j2 ( 2.15 버전 이후 업데이트해야 취약점 방지가능)


Slf4j

스프링의 Logging Framework에서 가장 유명한 라이브러리가 바로 slf4j(Simple Logging Facade For Java) 입니다.

slf4j는 다양한 자바 로깅 시스템을 사용할 수 있도록 해주는 파사드 패턴의 인터페이스라고 생각하시면 될 것 같습니다.

즉, 위 그림과 같이 slf4j를 사용하면 logback, log4j, log4j2와 같은 구현체를 어플리케이션에 영향 없이 손쉽게 교체할 수 있습니다.

그래서 @Sl4j 어노테이션으로 logback이니 log4j2 같은 라이브러리로 구현이 가능해집니다.


log4j2의 성능

  • log4j2는 Spring Boot에 기본으로 적용되어있는 logback 이후에 나온 라이브러리로 성능이 더 뛰어납니다.
  • 멀티스레드 환경에서 Async Logger의 경우 Logback보다 처리량이 18배 더 높고 대기 시간이 훨씬 더 짧다고 합니다.
  • 성능에 대한 자세한 내용은 https://logging.apache.org/log4j/2.x/performance.html를 참고하세요.


의존성 추가

spring-boot-starter-web에는 기본적으로 logback 로깅 모듈이 포함되어 있지만, 성능 상 log4j2가 logback 보다 우수하기 때문에 이를 제외하고 log4j2를 추가해주는 작업을 해줄 것입니다.

implementation 'org.springframework.boot:spring-boot-starter-log4j2'

...

// log4j2 의존성을 추가해주고, spring-boot-starter-logging을 제외시켜주어야 한다.
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    all {
        //logback과의 충돌 방지
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

실제 jar

실제 jar는 이런데 log4j... SpringBoot 쓰시는 분들은 denpendacy를 사용하시니 이건 건너뛰시고


log4j2.xml

resources/log4j2.xml을 만들어줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <!-- 해당 설정파일에서 사용하는 프로퍼티-->
    <Properties>
        <property name="LOGS_PATH">C:\test_logs</property>
    </Properties>

    <Appenders>
        <!-- 콘솔 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level %logger{35} - %msg%n" />
        </Console>

        <!-- 파일 -->
        <RollingFile name ="RollingFile">
            <FileName>${LOGS_PATH}/log4j2.log</FileName>
            <FilePattern>${LOGS_PATH}/log4j2.%d{yyyy-MM-dd}.%i.log.gz</FilePattern>
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} %5p [%c] %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
                <TimeBasedTriggeringPolicy interval = "1" modulate = "true"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- Application Loggers -->
        <!-- Root 보다 우선 순위가 높습니다. -->
        <logger name="com.test.api.controller" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFile" />
        </logger>

        <logger name="com.test.api.service" level="INFO" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFile" />
        </logger>

        <!-- FATAL, ERROR, WARN, INFO, DEBUG, TRACE -->
        <Root level="INFO">
            <AppenderRef ref="console" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </Loggers>
</Configuration>

실제 로그가 이렇게 남긴다.


코드

@Log4j2 // -> @Sl4j로 해도 상관x
@RestController
public class TestController {

    @GetMapping(value = "/log")
    public void log() throws Exception {

        //FATAL, ERROR, WARN, INFO, DEBUG, TRACE
        log.fatal("FATAL");
        log.error("ERROR");
        log.warn("WARN");
        log.info("INFO");
        log.debug("DEBUG");
        log.trace("TRACE");
    }

}

log파일 생성


취약점 조치

최근에 log4j2 취약점이 등장했습니다. 2.15 버전 미만인 경우 아래의 링크로 접속해 버전 업데이트 해야 합니다.

https://veneas.tistory.com/entry/Spring-Boot-스프링-부트-Log4J2-취약점-조치-Log4J2-버전-업데이트

기존것은 주석처리하고 log4j 의존성들을 2.15버전으로 업데이트해줍니다.

	// implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    
	// 추가
	implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.15.0'
	implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.15.0'
	implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.15.0'
	implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.15.0'
	implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.32'
	implementation group: 'org.slf4j', name: 'jul-to-slf4j', version: '1.7.32'


참고

profile
배운 것을 기록합니다.

0개의 댓글