Logger

Java/Core Utilities 2013. 2. 9. 14:35

Logger를 처음 생성할때 로거 이름을 파라미터로 ‘.’으로  구분을 주거나 클래스를 매개변수로 넘겨 주게된다.

 

    static Logger log = Logger.getLogger("com.oreilly.learnjava.Book");

 

이러한 로거 이름은 계층적으로 관리되어지며 계층적 상위의 설정내용이 하위 설정으로 자동적으로 상속이 되도록 한다.

 

Handlers

실제로 로그메시지가 어느 곳으로 보내어 질지는 Handler 객체에의해 결정되어진다. Handler로서 기본적으로 제공되어 지는 것으로 ConsoleHandler, FileHandler, StreamHandler, SocketHandler 등이 있다. 그 이외에 MemoryHandler가 있는데 순환형태의 버퍼형태로 작동된다. MemoryHandler는 많은 로그정보를 메모리에 담고있다가 특정 트리거에의해 다른 핸들러로 메시지들을 보내(Publish)게 된다.

 

Filters

로그 메시지는 해당 핸들러 또는 상위 부모 핸들러에의해 처리(Publish)되기 이전에 처리되기 위해 로깅 Level이 적절한지를 먼저 체크하며 만일 해당 메시지가 로깅 레벨에 적합하지 않게되면 소스에서 무시하게된다. 이러한 필터는 별도구 구현되어질 수 있으며 런타임시 어플리케이션의 외부에서 적용 가능하다.

 

Formatters

로그 메시는 Formatter를 이용하여 로그 메시지의 출력형태를 설정할 수 있다. 이러한 Formatter의 종류로는 SimpleFormatter, XMLFormatter등이 있으며 별도의 Formatter를 구현할 수있다.

 

Logging Setup Properties

기본 로깅에대한 설정은 jre가 설치된 lib/logging.properties 파일에 정의되어 있지만 JVM 옵션으로 별도의 설정파일을 지정할 수 있다.

> Java –Djava.util.logging.configfile=myfile.properties

와 같이 지정하면 된다.



# Default logging level

.level = INFO

 

# Ouput to file and console

handlers = java.util.logging.FileHandlerjava.util.logging.ConsoleHandler

 

# Configure the file output

java.util.logging.FileHandler.level = FINEST

java.util.logging.FileHandler.pattern = %h/device%u.log

java.util.logging.FileHandler.limit = 50000

java.util.logging.FileHandler.count = 1

java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

 

# Configure the console output

java.util.logging.ConsoleHandler.level = FINEST

 

# Levels for specific classes

#com.level = FINEST


  

로그 레벨은 다음과 같이 계층적 또는 특정 클래스별로 지정이 가능하며 하위 계층에있는 로그레벨이 자동 적용 된다.

> com.level = FINEST

> com.oreilly.level = FINEST

> com.oreilly.LogTest.level = FINEST

 


Log4j 설정파일과 테스트 코드

자바의 기본 내장 Logger와는 조금 다르지만 Log4j기준의 설정파일과 실행코드를 살펴보면 다음과 같다.

 

# 루트 Logger 방식이 아닌 각각의 Logger 방식으로 3가지 Logger 선언

log4j.logger.process.work1 = DEBUG, WORK1

log4j.logger.process.work2 = DEBUG, WORK2

log4j.logger.process.work3 = DEBUG, WORK3

 

# WORK1 Logger 정보를 설정

log4j.appender.WORK1 = org.apache.log4j.DailyRollingFileAppender

log4j.appender.WORK1.File = work1.log

log4j.appender.WORK1.DatePattern = '.'yyyy-MM-dd

log4j.appender.WORK1.Threshold = DEBUG

log4j.appender.WORK1.layout = org.apache.log4j.PatternLayout

log4j.appender.WORK1.layout.ConversionPattern = [%d] %-5p %l - %m%n

 

# WORK2 Logger 정보를 설정

log4j.appender.WORK2 = org.apache.log4j.DailyRollingFileAppender

log4j.appender.WORK2.File = work2.log

log4j.appender.WORK2.DatePattern = '.'yyyy-MM-dd

log4j.appender.WORK2.Threshold = DEBUG

log4j.appender.WORK2.layout = org.apache.log4j.PatternLayout

log4j.appender.WORK2.layout.ConversionPattern = [%d] %-5p %l - %m%n

 

# WORK3 Logger 정보를 설정

log4j.appender.WORK3 = org.apache.log4j.DailyRollingFileAppender

log4j.appender.WORK3.File = work3.log

log4j.appender.WORK3.DatePattern = '.'yyyy-MM-dd

log4j.appender.WORK3.Threshold = DEBUG

log4j.appender.WORK3.layout = org.apache.log4j.PatternLayout

log4j.appender.WORK3.layout.ConversionPattern = [%d] %-5p %l - %m%n

 

 

import org.apache.log4j.Logger;

 

public class LoggerTest {

 

       // 각각의 Logger 가져온다.

       static Logger logger1 = Logger.getLogger("process.work1");

       static Logger logger2 = Logger.getLogger("process.work2");

       static Logger logger3 = Logger.getLogger("process.work3");

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              // 로그 출력

              logger1.error("Hello log4j.");

              logger2.error("Hello log4j.");

              logger3.error("Hello log4j.");

       }

 

}

 

 

 

 

'Java > Core Utilities' 카테고리의 다른 글

Navigable Collection  (0) 2013.11.04
Observers and Observables  (0) 2013.02.09
Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Posted by Steven J.S Min
,