2011년 6월 9일 목요일

Jakarta Commons Logging

소개

Jakarta Commons Logging(JCL)은 많은 로깅 툴킷에 독립적인 경량의 로그 인터페이스이다. JCL은 미들웨어 및 툴 개발자에게 단순한 로깅 추상화 계층을 제공하기 때문에 사용자(애플리케이션 개발자)는 특정 로깅 구현체를 플러그인하여 사용할 수 있게 된다. JCL은 Log4j, Avalon LogKit, JDK1.4를 포함한 다른 로깅 툴에 대한 경량의 래퍼(wrapper) 구현체에 대한 로그 인터페이스를 제공한다.

설정

JCL에는 다음과 같은 기본이 되는 두 가지 추상 클래스가 있다.
  • Log: 기본 Logger 인터페이스
  • LogFactory: Log 객체를 생성하는 방법을 알고 있는 추상 클래스

더 자세히 살펴본다면, JCL은 아래와 같이 구성되어 있다.
  • org.apache.commons.logging
    • Log: 다양한 로깅 API를 추상화시키는 단순한 로깅 인터페이스
    • LogFactory: Java API 중에서 JAXP와 유사하게 configuration과 관련 클래스를 찾는 과정을 거쳐서 Log의 인스턴스를 생성하는 추상 클래스
    • LogSource: Log 인스턴스를 생성하는 팩토리 객체
    • LogConfigurationException
  • org.apache.commons.logging.impl
    • Jdk14Logger: org.apache.commons.logging.Log 인터페이스의 구현체. JDK1.4에 소개된 표준 JDK 로깅 매커니즘을 래핑했다
    • Log4JCategoryLog
    • Log4jFactory
    • Log4JLogger: Log4J에 직접 매핑(mapping)된 Log 인터페이스의 구현체
    • LogFactoryImpl
    • LogKitLogger: avalon-logkit를 랩핑한 Log 인터페이스의 구현체
    • NoOpLog
    • SimpleLog

LogFactory는 아래와 같은 절차에 따라서 Log 구현체를 찾는다. 아래 과정은 순서대로 진행되고, 제일 처음 성공한 단계 이후의 과정은 진행시키지 않는다.
  1. LogFactory에 대한 configuration 속성 중에서 org.apache.commons.logging.Log라는 속성을 찾는다
  2. 시스템 프로퍼티에서 이 속성을 찾는다
  3. 애플리케이션 클래스 패스안에 Log4j 로깅 시스템를 찾는다. 만약 애플리케이션의 클래스 패스에 Log4j 로깅 시스템에 대해서 찾았다면, Log4j에 관련된 래핑 클래스인 Log4JLogger를 이용한다
  4. 애플리케이션이 만약 JDK1.4 시스템에서 구동 중이라면, JDK 1.4과 관련된 래핑 클래스인 Jdk14Logger를 이용한다
  5. 위 과정 모두 실패했다면, SimpleLog라는 디폴트로 제공되는 로깅 래핑 클래스를 사용한다

사용

JCL를 사용하는 과정은 아래와 같다.
  1. LogFactory.getFactory()를 호출하여 LogFactory 객체를 얻는다
  2. 위 과정에서 얻어진 LogFactory 객체의 getInstance(String name)라는 메소드를 호출하여 org.apache.commons.logging.Log 형의 인스턴스를 얻어낸다
  3. 이렇게 얻어낸 Log형의 인스턴스의 debug(), info(), warn(), error(), fatal() 함수를 호출하여 로그 기능을 이용한다

예제
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyComponent {
protected static Log log = LogFactory.getLog("my.component");
//보통 my.component에는 패키지명을 적습니다.

// Called once at startup time
public void start() {
   ...
   log.info("MyComponent started");
   ...
}

  // Called once at shutdown time
  public void stop() {
    ...
    log.info("MyComponent stopped");
    ...
  }

  // Called repeatedly to process a particular argument value
  // which you want logged if debugging is enabled
  public void process(String value) {
    ...
    // Do the string concatenation only if logging is enabled
    if (log.isDebugEnabled())
      log.debug("MyComponent processing " + value);
    ...
  }

}

왜 JCL을 사용해야 하는가?

XML 관련 프로그래밍을 해봤다면 JAXP를 사용해봤을 것이다. 디렉토리 서비스 관련 프로그래밍을 해봤다면 JNDI를 사용해봤을 것이다. 또한, RDBMS 관련 프로그래밍을 해봤다면 JDBC를 사용해봤을 것이다. 이 모두가 특정 구현체에 종속되지 않는 애플리케이션 작성을 위한 공통 인터페이스를 제공한다. JCL도 마찬가지라고 생각하면 된다. 많은 로깅 관련 구현체가 있는데, 특정 로깅 관련 구현체에 종속되지 않는 애플리케이션 구현을 위해서는 JCL을 사용하는 것이 좋을 것이다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...