현지화된 메시지 로깅

Java EE 2007/09/03 14:10 Posted by Sun
저자 JZ Ventures사의 사장 겸 대표 컨설턴트 John Zukowski

이 아티클의 영문 원본은 http://java.sun.com/mailers/techtips/co ··· html%231
에서 볼수 있습니다.

Java SE 1.4 릴리스와 함께 선보인 후 로깅API에 큰 변화는 없었지만, 다음과 같이 메시지를 로깅할 때 많은 이들이 미처 깨닫지 못하는 두 가지가 있다.

logger.log(level, message);

첫 번째는, 메시지 인수가 하드 코딩된 문자열일 필요가 없다는 것이다. 두 번째는 메시지가 인수를 가질 수 있다는 것이다. 내부적으로, 로거는 MessageFormat에 의존하면서 로그 메시지 문자열 다음에 전달되는 모든 인수를 받아 메시지의 공백을 채우는 데 이를 사용한다. log()에 대한 메시지 문자열 인수 다음에 오는 첫 번째 인수가 색인 0을 갖고 문자열 {0}으로 표현된다. 다음 인수는 {1}이고 그 다음은 {2} 등으로 진행된다. 또한 서식 설정 세부 정보를 추가로 제공할 수 있는데, 예를 들어 {1, time}은 Date 인수 중 시간 부분만 표시한다.

이를 확인하기 위해 서식 설정된 로그 메시지 호출의 예를 소개한다.

String filename = ...;
String message = "Unable to delete {0} from system.";
logger.log(level, message, filename);

이제 파일 이름 GWBASIC.EXE에 대해 표시되는 메시지는 "Unable to delete GWBASIC.EXE from system."이 된다.

이것만 놓고 보면 그다지 특별한 점은 없는 듯하다. 이 추가적인 서식 설정이 진가를 발휘할 때는 메시지 인수를 리소스 번들에 대한 조회 키로 취급하는 경우이다. 로거를 가져올 때 로거 이름만 전달하거나 아니면 이름과 리소스 번들 이름을 모두 전달할 수 있다.

리소스 번들에서 가져온 메시지를 로컬 인수와 결합함으로써 프로그램에서뿐 아니라 로그 메시지에서도 현지화 및 매개변수화된 메시지의 이점을 모두 누리게 된다.

메시지 인수를 리소스 번들에 대한 조회 키로 취급하려면 로거를 가져오는 방식이 약간 바뀌어야 한다. 리소스 번들을 사용하려면 로거 개체를 다음과 같이 생성해서는 안 된다.

private static Logger logger =
    Logger.getLogger("com.example");


그 대신 getLogger() 호출에 두 번째 인수 옵션을 추가한다. 이 인수는 현지화된 메시지를 포함하는 리소스 번들이다. 그러면 메시지 로깅을 위해 호출할 때 "메시지" 인수는 리소스 번들에 대한 조회 키이며, 그 이름이 getLogger() 호출에 전달된다.

private static final String BUNDLE_NAME = "com.example.words";
private static Logger logger =
    Logger.getLogger("com.example", BUNDLE_NAME);

BUNDLE_NAME 리소스 번들은 로깅 호출에 제공된 키에 알맞은 메시지를 포함해야 한다.

logger.log(level, "messageKey");

"messageKey"가 리소스 번들에서 유효한 키라면 이제 연결된 메시지 텍스트가 로깅 API에 로깅된 것이다. 이 메시지 텍스트는 메시지 인수를 로거에 전달하기 위해 이 {0}-like 인수를 포함할 수 있다.

String filename = ...;
logger.log(level, "messageKey", filename);

"messageKey"에 {0} 서식 설정 문자열이 나타나지 않지만(그 값은 리소스 번들에서 가져온 것이므로) 출력의 서식을 다시 MessageFormat으로 설정할 수 있다.

이제 모든 조각을 끼워 맞춰 보자. 현지화된 로깅을 표시하는 작은 애플리케이션을 만든다.

복잡성을 배제하기 위해 이 리소스 번들은 ListResourceBundle 개체가 아니라 PropertyResourceBundle 개체가 된다.

로컬 디렉토리에 기본 로케일(US English로 가정)의 메시지를 포함할 messages.properties 파일을 만든다.

Message1=Hello, World
Message2=Hello, {0}


두 번째 언어는 스페인어로 한다. messages_ES.properties 파일에 다음을 포함시킨다.

Message1=Hola, mundo
Message2=Hola, {0}

이제 애플리케이션을 만들어야 한다. getAnonymousLogger() 메소드는 리소스 번들 이름을 적용하는 두 번째 버전도 포함한다. 명명된 로거를 사용하려면 원하는 대로 이름을 전달하고 getLogger()를 대신 사용한다.

import java.util.logging.*;

public class LocalLog {
  private static Logger logger =
      Logger.getAnonymousLogger("message");
  public static void main(String argv[]) {
    logger.log(Level.SEVERE, "Message1");
    logger.log(Level.SEVERE, "Message2", "John");
  }
}


LocalLog 프로그램의 로그 메시지는 "Message1" 및 "Message2"이다. 기본 로케일로 실행할 경우 다음과 비슷한 메시지가 표시된다.

> java LocalLog
Aug 4, 2007 12:00:35 PM LocalLog main
SEVERE: Hello, World
Aug 4, 2007 12:00:35 PM LocalLog main
SEVERE: Hello, John


다른 로케일로 프로그램을 실행하려면 명령줄에서 user.language 시스템 등록 정보를 설정한다.

>java -Duser.language=ES LocalLog
ago 4, 2007 12:01:18 p.m. LocalLog main
GRAVE: Hola, mundo
ago 4, 2007 12:01:18 p.m. LocalLog main
GRAVE: Hola, John

로그 메시지가 현지화된 리소스 번들 메시지를 포함하고 있으며, 로거 역시 현지화된 날짜 문자열과 현지화된 심각도 수준 텍스트를 사용한다.

현지화된 로그 메시지를 만들 때 이 기능을 염두에 두도록 한다. 리소스 번들을 사용하여 현지화된 로그 메시지와 사용자 인터페이스 텍스트를 모두 제공할 수 있다. 로그 파일을 읽는 사람은 번역된 텍스트도 볼 수 있어야 한다.

리소스 번들에 대한 자세한 내용은 리소스 번들 로딩 팁Java Tutorial의 Isolating Locale-Specific Data 단원을 참조한다.

"Java EE" 카테고리의 다른 글

2007/09/03 14:10 2007/09/03 14:10

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/434

  1. 현지화된 메시지 로깅

    Tracked from Breeze Idea Factory  삭제

    SDN에 현지화된 메시지 로깅 관련 글이 올라왔다. internationalize 된 application을 만들경우 이러한 localize된 로그 메시지 처리 부분이 필요하다.

    2007/09/14 10:47
  2. 현지화된 메시지 로깅

    Tracked from 신욱  삭제

    현지화된 메시지 로깅

    2007/09/19 09:56
  3. 현지화된 메시지 로깅

    Tracked from ★ dingpong의 조그만 휴식 공간 ★  삭제

    현지화된 메시지 로깅강좌 입니다. 이 강좌를 보니 제가 만들고 있는 프로그램에서도 다국어 언어처리를 하는데 고생했던 기억이 좀 납니다. 여러 나라에서 서비스 해야 하는 프로그램이고 여러 언어를 지원해야 한다면 이러한 현지화된 메세지 로깅은 필수 일 것입니다. 이러한 로케일 처리를 잘 못 한다면 굉장히 큰 문제가 생길 수 있기 때문에 프로그램에

    2007/09/19 22:07

댓글을 달아 주세요

  1. 오주일  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. 유익한 정보였습니다.

    2007/09/14 09:12
  2. 비밀방문자  수정/삭제  댓글쓰기

    관리자만 볼 수 있는 댓글입니다.

    2007/09/14 10:42
  3. 김문경  수정/삭제  댓글쓰기

    알아가는 재미가 좋읍니다^^

    2007/09/14 21:39
  4. 김영호  수정/삭제  댓글쓰기

    아~~그렇구나~~오늘 중요한 내용 공부했네요...^^ 지금 독학으로 공부하고
    있는데요~~ 책으로 배울 수 없는 부분도 알려주어서 너무나 감사합니다.^^

    2007/09/15 12:05
  5. 최익준  수정/삭제  댓글쓰기

    아...좋은 정보 감사합니다 ^^
    자꾸 사용해봐서 능숙할때까지 해봐야겠네요 ^^;;

    2007/09/16 17:29
  6. 고진구  수정/삭제  댓글쓰기

    항상 요긴한 정보로 도움을 많이 받고 있습니다. 자바 신기술 따라잡기에 썬 개발자 네트워크만큼 좋은 곳도 없나봅니다. 언제나 좋은 자료 감사합니다.

    2007/09/16 22:41
  7. 신명  수정/삭제  댓글쓰기

    음.. 이런 것도 있군요..

    2007/09/17 13:43
  8. 황종생  수정/삭제  댓글쓰기

    정보의 소중함을 다시한번 느끼네요. 많이 배우고 갑니다.^^

    2007/09/17 14:19
  9. 신경남  수정/삭제  댓글쓰기

    너무 너무 감사합니다. 하나씩 하나씩 배워갑니다.

    2007/09/18 10:40
  10. 박기형  수정/삭제  댓글쓰기

    알았던 내용이지만 다시 복습하니 새롭네요.

    2007/09/19 03:08
  11. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 03:19
  12. 김덕경  수정/삭제  댓글쓰기

    좋은자료 많이 많이 올려주세요..감사

    2007/09/19 06:38
  13. 박상현  수정/삭제  댓글쓰기

    현지화된 메시지 로깅과 리소스번들이라.. 메시지 로깅부분은 제가 자세하게는 몰랐던 부분인데 여기서 알게 되네요..

    2007/09/19 11:00
  14. 김성철  수정/삭제  댓글쓰기

    문자와 인수.부분이라 헷갈리기도 개념을 잡기도 녹녹치 않은 부분이죠.
    물론 저도 그렇습니다. 크흑.

    2007/09/19 12:36
  15. 성덕경  수정/삭제  댓글쓰기

    유용한 정보 감사합니다.

    2007/09/19 13:06
  16. 반석규  수정/삭제  댓글쓰기

    앞으로도 좋은 정보 많이 부탁드립니다.
    저에게 많은 도움이 되어서 정말 좋은데
    많은 사람들에게 도움줄수 있는 블로그가 되십시오~!

    2007/09/19 14:27
  17. 전수미  수정/삭제  댓글쓰기

    차근착는 알아가도록 할께요..정보 감사합니다

    2007/09/19 17:48
  18. 이창복  수정/삭제  댓글쓰기

    앞으로도 좋은 정보 많이 부탁드립니다.

    2007/09/19 19:17
  19. 이종민  수정/삭제  댓글쓰기

    직접적인 개발자가 아니라서 정확한 세부사항까지 이해하기는 어려웠지만 나름 좋은 지식공유가 된것 같아서 기쁘네요... 앞으로도 좋은 지식발견이 되었으면 좋겠습니다. 감사합니다...!

    2007/09/19 21:06
  20. 최인균  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. 로케일 처리가 프로그램이 꺼지고 그럴 수록 복잡하니 국제화된 프로그램을 만들때는 필수지요^-^ 실무에서 쓰일 수 있는 좋은 정보인 것 같습니다! 담아갑니다~*

    2007/09/19 22:11
  21. 진유라  수정/삭제  댓글쓰기

    몰랐던 내용을 하나씩 접하게 해주셔서 감사해요.
    좋은 정보 보고 갑니다 ^^

    2007/09/19 22:29
  22. 김복선  수정/삭제  댓글쓰기

    정말 좋은 내용이 많은거 같아요
    많이 배우고 가요~

    2007/09/19 22:58
  23. 이경호  수정/삭제  댓글쓰기

    이런 기능도 있었군요. 감사합니다.
    한번 사용해봐야 겠어요~

    2007/09/20 09:31
[로그인][오픈아이디란?]

◀ Prev 1  ... 211 212 213 214 215 216 217 218 219  ... 624  Next ▶