저자 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 단원을 참조한다.
댓글을 달아 주세요
좋은 정보 감사합니다. 유익한 정보였습니다.
2007/09/14 09:12관리자만 볼 수 있는 댓글입니다.
2007/09/14 10:42알아가는 재미가 좋읍니다^^
2007/09/14 21:39아~~그렇구나~~오늘 중요한 내용 공부했네요...^^ 지금 독학으로 공부하고
2007/09/15 12:05있는데요~~ 책으로 배울 수 없는 부분도 알려주어서 너무나 감사합니다.^^
아...좋은 정보 감사합니다 ^^
2007/09/16 17:29자꾸 사용해봐서 능숙할때까지 해봐야겠네요 ^^;;
항상 요긴한 정보로 도움을 많이 받고 있습니다. 자바 신기술 따라잡기에 썬 개발자 네트워크만큼 좋은 곳도 없나봅니다. 언제나 좋은 자료 감사합니다.
2007/09/16 22:41음.. 이런 것도 있군요..
2007/09/17 13:43정보의 소중함을 다시한번 느끼네요. 많이 배우고 갑니다.^^
2007/09/17 14:19너무 너무 감사합니다. 하나씩 하나씩 배워갑니다.
2007/09/18 10:40알았던 내용이지만 다시 복습하니 새롭네요.
2007/09/19 03:08좋은 정보 감사해요~
2007/09/19 03:19좋은자료 많이 많이 올려주세요..감사
2007/09/19 06:38현지화된 메시지 로깅과 리소스번들이라.. 메시지 로깅부분은 제가 자세하게는 몰랐던 부분인데 여기서 알게 되네요..
2007/09/19 11:00문자와 인수.부분이라 헷갈리기도 개념을 잡기도 녹녹치 않은 부분이죠.
2007/09/19 12:36물론 저도 그렇습니다. 크흑.
유용한 정보 감사합니다.
2007/09/19 13:06앞으로도 좋은 정보 많이 부탁드립니다.
2007/09/19 14:27저에게 많은 도움이 되어서 정말 좋은데
많은 사람들에게 도움줄수 있는 블로그가 되십시오~!
차근착는 알아가도록 할께요..정보 감사합니다
2007/09/19 17:48앞으로도 좋은 정보 많이 부탁드립니다.
2007/09/19 19:17직접적인 개발자가 아니라서 정확한 세부사항까지 이해하기는 어려웠지만 나름 좋은 지식공유가 된것 같아서 기쁘네요... 앞으로도 좋은 지식발견이 되었으면 좋겠습니다. 감사합니다...!
2007/09/19 21:06좋은 정보 감사합니다. 로케일 처리가 프로그램이 꺼지고 그럴 수록 복잡하니 국제화된 프로그램을 만들때는 필수지요^-^ 실무에서 쓰일 수 있는 좋은 정보인 것 같습니다! 담아갑니다~*
2007/09/19 22:11몰랐던 내용을 하나씩 접하게 해주셔서 감사해요.
2007/09/19 22:29좋은 정보 보고 갑니다 ^^
정말 좋은 내용이 많은거 같아요
2007/09/19 22:58많이 배우고 가요~
이런 기능도 있었군요. 감사합니다.
2007/09/20 09:31한번 사용해봐야 겠어요~