===== SLF4J =====
==== Getting Started ====
SLF4J(Simple Logging Facade For Java)는 특정 Logging 서비스 구현체에 종속되지 않도록 추상화 계층을 제공하며,\\
Jakarta Commons Logging(JCL), Log4j, Logback 등과 함께 사용할 수 있다.\\
다음은 SLF4J 샘플 예제이다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4JLoggerTest {
// SLF4J를 이용한 Logger 오브젝트 생성
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4JLoggerTest.class);
// Parameterized logging - String 타입
String message = "Hello, eGovFrame 3.0";
String message2 = "Welcome to eGovFrame 3.0";
LOGGER.debug("SLF4J Logger - {}", message); // 출력결과 - SLF4J Logger - Hello, eGovFrame 3.0
LOGGER.debug("SLF4J Logger - {} and {}", message, message2); // 출력결과 - SLF4J Logger - Hello, eGovFrame 3.0 and Welcome to eGovFrame 3.0
// Parameterized logging - Object 타입
Object[] args = new Object[3];
args[0] = "1";
args[1] = Integer.valueOf("2");
args[2] = new Date().toString();
LOGGER.debug("SLF4J Logger - {}, {}, {}", args); // 출력결과 - SLF4J Logger - 1, 2, Fri Mar 23 11:08:28 KST 2014
}
=== 1. SLF4J 기본 설정 ===
1) SLF4J API를 사용하기 위해 **slf4j-api.jar를 추가**한다.
org.slf4j
slf4j-api
x.x.x
2) Logging 충돌 방지를 위해 Spring의 Default Logging Framework인 **commons-logging.jar를 제거**하되,\\ 기존 Commons Logging API가 적절하게 변환되어 처리될 수 있도록 SLF4j JCL Bridge인 **jcl-over-slf4j.jar를 추가**한다.
org.springframework
spring-context
${spring.maven.artifact.version}
commons-logging
commons-logging
org.slf4j
jcl-over-slf4j
x.x.x
=== 2. Logging 구현체 설정 ===
1) SLF4J가 컴파일 시에 Logging 구현체를 사용할 수 있도록 구현체별 **SLF4J Binding jar와 Implementation jar를 추가**한다.
^ Logging 구현체 ^ SLF4J Binding jar ^
| Log4j 2 | log4j-slf4j-impl.jar |
| Log4j 1.2 | slf4j-log4j12.jar |
| JDK 1.x Logging | slf4j-jdk14.jar |
| NOP | slf4j-nop.jar |
| JCL | slf4j-jcl.jar |
| Logback | logback-classic.jar, logback-core.jar |
* Log4j 1.2 구현체 사용 시
org.slf4j
slf4j-log4j12
x.x.x
log4j
log4j
1.2
* Log4j 2 구현체 사용 시
org.apache.logging.log4j
log4j-slf4j-impl
x.x.x
org.apache.logging.log4j
log4j-api
x.x.x
=== 3. SLF4J Logger 객체 생성과 메서드 사용 ===
1) Logger 객체 생성
private static final Logger LOGGER = LoggerFactory.getLogger(Slf4JLoggerTest.class);
2) 로깅 메서드 호출\\
// {}-placeholder를 이용한 Parameterized Logging
String message = "Hello, eGovFrame 3.0";
LOGGER.debug("SLF4J Logger - {}", message);
==== Migration to SLF4J from Legacy APIs ====
기존 Legacy API을 유지한 채 SLF4J를 함께 사용하려면, SLF4J와 레거시 API를 연결할 수 있는 Bridge jar가 필요하다.\\
아래에서는 Log4j 1.x와 JCL 레거시를 기준으로 설명한다.
=== 1. Logging 구현체 jar를 SLF4J Bridge jar로 대체 ===
이는 각 구현체의 Logging 제어권을 SLF4J로 넘긴다는 것을 의미하며, 레거시 API를 유지하기 위해서 필요한 작업이다.
1) Log4j 1.x 유지 시, log4j.jar를 log4j-over-slf4j.jar로 대체
org.slf4j
log4j-over-slf4j
x.x.x
(주의) log4j-over-slf4j.jar는 slf4j-log4j12.jar(SLF4j Binding)과 동시에 사용할 수 없다.
2) JCL(Jakarta Commons Logging) 유지 시, commons-logging.jar를 jcl-over-slf4j.jar로 대체
org.slf4j
jcl-over-slf4j
x.x.x
=== 2. 환경설정 파일을 logback으로 변경 ===
log4j 환경설정 파일은 SLF4J가 인식할 수 없기 때문에, 기존 환경설정을 logback으로 변경해야한다.\\
[[ http://logback.qos.ch/translator/ | log4j properties file translator ]]를 이용하거나 [[ http://logback.qos.ch/manual/index.html | logback manual ]]을 참조하여 변경할 수 있다.
다음은 logback.xml 샘플이다.
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
===== 참고 자료 =====
* [[ http://www.slf4j.org/ | SLF4J ]]
* [[ http://logback.qos.ch/ | Logback ]]