문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
java:log4j:pattern [2011/06/21 11:40] kwon37xi 새로 만듦 |
java:log4j:pattern [2015/11/15 16:18] (현재) kwon37xi [패턴] |
||
---|---|---|---|
줄 1: | 줄 1: | ||
- | ====== Log4j 패턴 확장 ====== | + | ====== Log4j 로그 패턴 ====== |
+ | ===== 패턴 ===== | ||
+ | |||
+ | * [[http:// | ||
+ | * http:// | ||
+ | * %p debug, info, warn, error, fatal 등의 priority 가 출력된다. | ||
+ | * %m 로그내용이 출력됩니다 | ||
+ | * %d 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH: | ||
+ | * %d{ABSOLUTE} | ||
+ | * %d{DATE} | ||
+ | * %d{ISO8601} | ||
+ | * %t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다. | ||
+ | * %% % 표시를 출력하기 위해 사용한다. | ||
+ | * %n 플랫폼 종속적인 개행문자가 출력된다. rn 또는 n 일것이다. | ||
+ | * %c 카테고리를 표시합니다 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다. | ||
+ | * %C 클래스명을 포시합니다. 예)클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다 | ||
+ | * %F 로깅이 발생한 프로그램 파일명을 나타냅니다. | ||
+ | * %l 로깅이 발생한 caller의 정보를 나타냅니다 | ||
+ | * %L 로깅이 발생한 caller의 라인수를 나타냅니다 | ||
+ | * %M 로깅이 발생한 method 이름을 나타냅니다. | ||
+ | * %r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) | ||
+ | * %x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다. | ||
+ | * %X 로깅이 발생한 thread와 관련된 [[http:// | ||
+ | |||
+ | ==== 공백 패딩 ==== | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ====== hostname | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
+ | 아래는 %h 패턴을 사용하여 호스트이름을 로그로 남겨줄 수 있도록 하는 PatternLayout 확장이다. | ||
+ | |||
+ | - 이것 보다는 [[java: | ||
+ | |||
+ | 웹 서비스들은 대부분 다중 서버로 운영되는 경우가 많다. 그럴 경우 어느 서버에서 나온 로그인지를 판단할 수 있는 방법이 필요하다. 그래서 호스트이름을 로그로 남긴다. | ||
+ | |||
+ | <code java> | ||
+ | package kr.pe.kwonnam.log4j.pattern; | ||
+ | |||
+ | import java.net.InetAddress; | ||
+ | import java.net.UnknownHostException; | ||
+ | |||
+ | import org.apache.log4j.PatternLayout; | ||
+ | import org.apache.log4j.helpers.PatternConverter; | ||
+ | import org.apache.log4j.helpers.PatternParser; | ||
+ | import org.apache.log4j.spi.LoggingEvent; | ||
+ | |||
+ | public class HostnamePatternLayout extends PatternLayout { | ||
+ | |||
+ | public static final char HOSTNAME_PATTERN_CHAR = ' | ||
+ | |||
+ | protected static final String HOSTNAME; | ||
+ | |||
+ | static { | ||
+ | HOSTNAME = getHostname(); | ||
+ | } | ||
+ | |||
+ | protected static String getHostname() { | ||
+ | try { | ||
+ | InetAddress addr = InetAddress.getLocalHost(); | ||
+ | return addr.getHostName(); | ||
+ | } catch (UnknownHostException ex) { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | protected PatternParser createPatternParser(String pattern) { | ||
+ | return new PatternParser(pattern) { | ||
+ | |||
+ | @Override | ||
+ | protected void finalizeConverter(char c) { | ||
+ | PatternConverter pc = null; | ||
+ | |||
+ | switch (c) { | ||
+ | case HOSTNAME_PATTERN_CHAR: | ||
+ | pc = new PatternConverter() { | ||
+ | @Override | ||
+ | protected String convert(LoggingEvent event) { | ||
+ | return HOSTNAME; | ||
+ | } | ||
+ | }; | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | if (pc == null) { | ||
+ | super.finalizeConverter(c); | ||
+ | } else { | ||
+ | addConverter(pc); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | }; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | 실제 사용하기는 properties 방식은 다음과 같고, | ||
+ | <code properties> | ||
+ | log4j.appender.stdout=org.apache.log4j.ConsoleAppender | ||
+ | log4j.appender.stdout.layout=kr.pe.kwonnam.log4j.pattern.HostnamePatternLayout | ||
+ | </ | ||
+ | |||
+ | XML 방식은 다음과 같다. | ||
+ | <code xml> | ||
+ | < | ||
+ | <layout class=" | ||
+ | <param name=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | </ |