====== Log4j 로그 패턴 ====== ===== 패턴 ===== * [[http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html|Log4j PatternLayout class]] * http://nuninaya.tistory.com/98 에서 발췌 * %p debug, info, warn, error, fatal 등의 priority 가 출력된다. * %m 로그내용이 출력됩니다 * %d 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 [[http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html|SimpleDateFormat]]에 따른 포맷팅을 하면 된다 * %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://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/MDC.html|MDC(mapped diagnostic context)]]를 출력합니다. ''%X{key}'' 형태. ==== 공백 패딩 ==== * ''%5p'' : 우측 정렬로 로그 레벨을 남김. 로그레벨이 5글자가 안되면 왼쪽에 공백을 추가하여 5글자 맞춤. * ''%-5p'' : 좌측 정렬. ====== hostname 패턴 확장 ====== * [[http://www.jajakarta.org/log4j/jakarta-log4j-1.1.3/docs/deepExtension.html|Extending Log4J]] : 패턴 캐릭터 추가하는 방법 * [[http://lifeinide.blogspot.com/2011/06/host-and-user-name-in-log4j-logs.html|Life in IDE: Host and user name in log4j logs]] : 패턴 확장으로 hostname과 username 추가하는 방법. 패턴 캐릭터 추가하는 방법 중에서 호스트네임 가져오는 부분만 발췌 아래는 %h 패턴을 사용하여 호스트이름을 로그로 남겨줄 수 있도록 하는 PatternLayout 확장이다. - 이것 보다는 [[java:log4j:rewrite_appender|Log4j Rewrite Appender]]를 이용해서 LogEvent의 properties에 프라퍼티로 호스트네임을 일괄 추가해주는 것이 더 좋은 방법일 듯하다. 이 경우에는 Console 뿐만 아니라 [[java:log4j:socketappender|SocketAppender & SocketHubAppender]] 등의 여러 종류의 Appender에서 일괄 적용되게 되며 MDC 문법으로 Console 어펜더에서도 사용가능해 진다. 웹 서비스들은 대부분 다중 서버로 운영되는 경우가 많다. 그럴 경우 어느 서버에서 나온 로그인지를 판단할 수 있는 방법이 필요하다. 그래서 호스트이름을 로그로 남긴다. 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 = 'h'; protected static final String HOSTNAME; static { HOSTNAME = getHostname(); } protected static String getHostname() { try { InetAddress addr = InetAddress.getLocalHost(); return addr.getHostName(); } catch (UnknownHostException ex) { return "unknown"; } } @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 방식은 다음과 같고, log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=kr.pe.kwonnam.log4j.pattern.HostnamePatternLayout XML 방식은 다음과 같다.