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 버전 이후 업데이트해야 취약점 방지가능)
스프링의 Logging Framework에서 가장 유명한 라이브러리가 바로 slf4j(Simple Logging Facade For Java)
입니다.
slf4j는 다양한 자바 로깅 시스템을 사용할 수 있도록 해주는 파사드 패턴의 인터페이스
라고 생각하시면 될 것 같습니다.
즉, 위 그림과 같이 slf4j를 사용하면 logback
, log4j
, log4j2
와 같은 구현체를 어플리케이션에 영향 없이 손쉽게 교체
할 수 있습니다.
그래서 @Sl4j 어노테이션
으로 logback
이니 log4j2
같은 라이브러리로 구현이 가능해집니다.
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는 이런데 log4j... SpringBoot 쓰시는 분들은 denpendacy를 사용하시니 이건 건너뛰시고
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");
}
}
최근에 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'