[MINA] Logging Configuration
팀내에서 MINA를 사용하면서 "선배 log4j가 있는데 계속 logging 쪽에서 에러가 떠요" 라는 질문을 받은 적이 있습니다. 지난 포스팅에서도 설명한적이 있지만 MINA 샘플들은 log4j 가 아닌 slf4j를 사용하고 있습니다. 사용법은 동일하지만 log4j보다 유연한 로깅메시지 처리를 할 수 있기 때문에 slf4j 라이브러리를 사용하였다고 하네요. 따라서 slf4j 라이브러리를 추가해야 정상적으로 샘플들을 구동할 수 있습니다.
Logging Configuration
이번 장에서는 MINA가 구현하고 있는 로깅처리부분을 살펴보도록 하겠습니다.
slf4j는 관련페이지를 참조하시길..
목차
- 목차
- 배경
- SLF4J
- 올바른 JARs 파일 선택하기
- Jakarta Commons Logging 상속
- 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상의 클래스패스안의 설정값으로 사용됩니다.
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 |