'LoggingFilter'에 해당되는 글 1건

  1. 2009.11.30 | [MINA] Logging Configuration

[MINA] Logging Configuration

개발 이야기/MINA | 2009. 11. 30. 10:27
Posted by 시반

팀내에서 MINA를 사용하면서 "선배 log4j가 있는데 계속 logging 쪽에서 에러가 떠요" 라는 질문을 받은 적이 있습니다. 지난 포스팅에서도 설명한적이 있지만 MINA 샘플들은 log4j 가 아닌 slf4j를 사용하고 있습니다. 사용법은 동일하지만 log4j보다 유연한 로깅메시지 처리를 할 수 있기 때문에 slf4j 라이브러리를 사용하였다고 하네요. 따라서 slf4j 라이브러리를 추가해야 정상적으로 샘플들을 구동할 수 있습니다.


Logging Configuration


이번 장에서는 MINA가 구현하고 있는 로깅처리부분을 살펴보도록 하겠습니다.

slf4j는 관련페이지를 참조하시길..

목차


  • 목차
  • 배경
  • SLF4J
    •  올바른 JARs 파일 선택하기
    • Jakarta Commons Logging 상속
  • log4j 예제

배경

 

Logging Confuguration  로깅환경설정에 있어서 기존의 log4j 의 환경을 그대로 사용할 수 있습니다.

SLF4J


배경에서 간단하게 언급은 했는데요 MINA가 slf4j 를 사용한다고 해서 특별한 로깅관련 설정이 필요한 것은 아니라는 점입니다. (SLF4J에 대한 정보는 이곳 에서 확인할 수 있습니다).

솔직히 특별한 로깅관련 설정이 필요없다기 보다 기존의 설정을 그대로 사용한다고 할까요. 대부분 log4j 또는 java.util.logging 또는 다른 logging관련 유틸리티를 사용하고 있을 테지만 slf4j은 그것들을 위한 간단한 facade 혹은 추상계층으로써 제공되기 때문입니다.
다시 말해서, slf4j는 엔드 유저가 희망하는 로깅 프레임워크를 배포시간에 플러그인할 수 있도록 허용하는 구조를 가지게 되기 때문에 개발중에 java.util.logging 에서 log4j로 변경해도 기존 소스의 변경이 없게 됩니다.

올바른JARs 파일 선택하기

SLF4J 은 정적 바인딩을 사용하고 있습니다. 이 말은 각 로깅 프레임워크에서 지원하는 단 하나의 JAR파일만이 있어야 한다는 것으로 사용하고 있는 버젼에 맞는 라이브러리만 추가하여야 합니다. 아래는 사용하고 있는 로깅 프레임워크에 따라 필요한 slf4j 파일들입니다.

Logging Framework
Requried JARs
Log4J 1.2.x
 slf4j-api.jar, slf4j-log4j12.jar
 Log4J 1.3.x
 slf4j-api.jar, slf4j-log4j13.jar
 java.util.logging   slf4j-api.jar, slf4j-jdk14.jar
 commons Logging
  slf4j-api.jar, slf4j-jcl.jar


주의사항 :

  • 보통 slf4j-api.jar 이 다른 JARs 내에서 이미 구현되어 사용되어 질 수도 있습니다
  • 중요한 건 당신이 당신의 클래스패스안에 하나 이상의 JAR 파일을 넣지 않는 것입니다 
    (예를 들면. slf4j-log4j12.jar slf4j-jdk14.jar 를 함께 넣지 마세요 그것은 예기치 못한 문제가 발생될지도 모릅니다
  • slf4j-api.jar slf4j-<impl>.jar 의 버전은 동일해야 합니다.

제대로 구성된 환경설정은 사용되는 로깅시스템이 유지하는 한 계속 사용할 수 있습니다(e.g. 수정된 log4j.properties).

 Jakarta Commons Logging 상속하기

SLF4J 은 또한 이미 Jakarta Commons Logging 을 사용하는 어플리케이션의 소스 변경없이 SLF4J 를 사용하도록 변환 할수 있는 방법을 제공합니다. 단지 클래스패스에서commons-loggong JAR 파일을 지우고 jcl104-over-slf4j.jar 를 추가하기만 하면 됩니다.


log4j 예제


이 예제는 log4j로 로깅 시스템을 구성하고 있습니다. 우리는 log4j.properties 를 열어 아래의 내용을 붙여 넣어 보겠습니다.


 # Set root logger level to DEBUG and its only appender to A1.
 log4j.rootLogger=DEBUG, A1

 # A1 is set to be a ConsoleAppender.
 log4j.appender.A1=org.apache.log4j.ConsoleAppender

 # A1 uses PatternLayout.
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n


이 파일은 프로젝트의 소스폴더에 있습니다. 만약 당신이 IDE를 사용하고 있다면 기본설정은 당신의 코드를 테스트하고자 할 때의 JVM상의 클래스패스안의 설정값으로 사용됩니다.

샘플예제는 지난 포스팅 예제인 MinaTimeServer 에 있는 예제를 가지고 설명합니다.:


 public
static void main(String[] args) throws Exception {
        IoAcceptor acceptor =
new SocketAcceptor();
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();


        LoggingFilter loggingFilter =
new LoggingFilter();
       
chain.addLast(
"logging", loggingFilter);                      
 

       
acceptor.setLocalAddress(
new InetSocketAddress(PORT));
       
acceptor.setHandler(
new EchoProtocolHandler());
       
acceptor.bind();

       
System.out.println("Listening on port " + PORT);
 }


위 예제에서는 IoAcceptor를 가지고 로깅하는 방법을 설명하고 있습니다. 어딘고 하니 acceptor에  LoggingFilter를 추가하는 부분이네요. 이 부분이 MINA가 slf4j를 구현한 부분으로 log4j를 사용하던지 commons-logging을 사용하던지 코드엔 변경이 없게 됩니다.

위에서는 간단한 로깅하는방법만을 예로 들었지만 좀더 요구사항에 따라 다양한 로깅정보를 생성할 수 있습니다.

LoggingFilter 레퍼런스에 따르면 IoAccepter 에 연결된 핸들러에 이벤트별로 로깅수준을 설정할 수 있습니다.
LoggingFilter에  setLogLevel(IoEventType,LogLevel) 이라는 메소드를 제공하고 있는데요.
IoHandler 이벤트 로깅을 추적하고 로깅수준에 따라 로그를 남길수 있습니다.

이 메소드의 옵션들은 다음과 같습니다:

IOEventType
Description
 SESSION_CREATED    새로운 세션을 생성할 때 호출된다
 SESSION_OPENED    새로운 세션이 열린 경우 호출된다
 SESSION_CLOSED    세션이 닫힌 경우 호출된다
 MESSAGE_RECEIVED    데이터를 받았을 때 호출된다
 MESSAGE_SENT    메시지를 전송할 때 호출된다
 SESSION_IDLE    세션 유휴타임에 도달한 때 호출된다
 EXCEPTION_CAUGHT    예외를 발생한 경우 호출된다

다음은 로깅 수준에 대한 설명입니다:

Log Level
Description
 NONE    설정과는 상관없이 로그를 남기지 않는다
 TRACE    로깅시스템에 추적 이벤트를 생성한다
DEBUG    로깅시스템에  debug 메시지를 남긴다.
INFO    로깅시스템에  info 메시지를 남긴다.
 WARN
   로깅시스템에  warning 메시지를 남긴다.
 ERROR    로깅시스템에  error 메시지를 남긴다.

'개발 이야기 > MINA' 카테고리의 다른 글

MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 기반의 어플리케이션 구조  (0) 2009.05.28
MINA 2.0 에코서버 만들기  (0) 2009.05.21
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)