본문 바로가기

Programing

logback

logback이라는 logging framework를 사용하기 위해서 공부한 내용 추가. 

logback home : http://logback.qos.ch/manual/index.html


logback 적용을 위해서는 slf4j-api.jar와 logback-cor.jar, logback-classic.jar가 필요. 이 세가지를 class path에 추가하면 된다. 





간단 사용 예제 


Example 1.1: Basic template for logging (logback-examples/src/main/java/chapters/introduction/HelloWorld1.java)

package chapters.introduction;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld1 {

 
public static void main(String[] args) {

   
Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
    logger
.debug("Hello world.");

 
}
}


위의 코드를 실행하면 아래와 같은 결과를 볼 수 있다. 


20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.


logback 설정을 하지 않았기 때문에 default인 ConsoleAppender가 root logger로 사용된다. 




Logger, Appender, Layout


Logback은 Logger, Appender, Layout 이라는 main class들로 이루어 져있다.  세가지 타입의 컴포넌트들은 개발자들이 message들을 원하는 레벨과 포맷으로 로깅할 수 있도록 해준다. 


Logger 클래스는 logback-class모듈에 속해 있다. Appender와 Layout 인터페이스들은 logback-core 모듈에 속해 있다. 

범용적인 모듈로서 logback-core는 logger란 개념을 가지지 않는다. 



Logger Context

모든 single logger들은 이것을 생산하고 tree구조로 정리하는 LoggerContext에 등록된다. 

Logger들은 case-sensitive하고 hierachical한 naming rule을 따른다. 


예를 들어 "com.foo"는 "com.foo.Bar"의 부모이다. "java"는 "java.util"의 부모이며 "java.util.Vector"의 조상이다. 


root logger는 hierarchy의 가장 높은 곳에 위치한다. root logger는 다른 logger들과 다르게 모든 hierarchy에 시초로 포함되어있다.  

다른 logger들과 같이 자신의 이름으로 logger를 생성할 수 있다. 

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);


모든 다른 logger들도 마찬가지로 org.slf4j.LoggerFactory 에 있는 getLogger 스태틱 메소드를 통해 만들어 질 수 있다. 이 메소드는 원하는 로거의 이름을 파라메터로 사용한다. 


package org.slf4j; 
public interface Logger {

 
// Printing methods:
 
public void trace(String message);
 
public void debug(String message);
 
public void info(String message);
 
public void warn(String message);
 
public void error(String message);
}

   

Logger들은 위의 interface를 따르면 위와 같은 기초 메소드를 제공한다. 



Effective Level aka Level Inheritance 


Logger들은 Level을 부여 받는다. 가능한 레벨은 (TRACE, DEBUG, INFO, WARN, ERROR)로 ch.qos.loogback.classic.Level 클래스에 정의되어 있다. 


만약 현재 logger에 대한 log leverl 설정이 없다면 상위 hierarchy의 logger들의 설정을 상속 받는다. 


Example 1

Logger nameAssigned levelEffective level
rootDEBUGDEBUG
XnoneDEBUG
X.YnoneDEBUG
X.Y.ZnoneDEBUG

위의 예제 1과 같이 root가 DEBUG라는 레벨을 선언하고 하위 child logger들에 아무것도 설정이 되어있지 않는 경우에는 모두 DEBUG로 Effective level이 설정된 것을 확인 할 수 있다. 


Example 2

Logger nameAssigned levelEffective level
rootERRORERROR
XINFOINFO
X.YDEBUGDEBUG
X.Y.ZWARNWARN

위의 예제 2와 같이 각각의 logger에 level을 부여해주면 각각 logger마다 지정해준 level을 부여 받는다. 


Example 3

Logger nameAssigned levelEffective level
rootDEBUGDEBUG
XINFOINFO
X.YnoneINFO
X.Y.ZERRORERROR

위의 예제 3에서와 같이 X.Y는 log level을 정해주지 않았기 때문에 부모 logger인 X의 level인 INFO를 상속 받는다. 



Printing method와 the basic selection rule 


print method가 로깅의 level을 결정 짓는다. 예를 들어 L.info("..")라는 것은 INFO 레벨의 로깅을 남긴다는 것과 같다. 

기본적으로 아래와 같은 룰을 따르는데 쉽게 설명하면 로그 설정보다 effective level이 높은 로그에 대해서는 로깅된다는 것이다. 

Basic Selection Rule

A log request of level p issued to a logger having an effective level q, is enabled if p >= q.



아래는 Effective level에 따른 logging 여부를 보여준다. 






'Programing' 카테고리의 다른 글

redis cluster 구성하기  (0) 2014.09.23
redis transaction  (0) 2014.09.10
redis pipeline  (0) 2014.09.10
redis  (0) 2014.09.08
homebrew, mongodb 설치  (0) 2012.05.05