%X{key}
형태.%5p
: 우측 정렬로 로그 레벨을 남김. 로그레벨이 5글자가 안되면 왼쪽에 공백을 추가하여 5글자 맞춤.%-5p
: 좌측 정렬.아래는 %h 패턴을 사용하여 호스트이름을 로그로 남겨줄 수 있도록 하는 PatternLayout 확장이다.
- 이것 보다는 Log4j Rewrite Appender를 이용해서 LogEvent의 properties에 프라퍼티로 호스트네임을 일괄 추가해주는 것이 더 좋은 방법일 듯하다. 이 경우에는 Console 뿐만 아니라 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 방식은 다음과 같다.
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> <layout class="kr.pe.kwonnam.log4j.pattern.HostnamePatternLayout"> <param name="ConversionPattern" value="%d %p %h [%c] - %m %n"/> </layout> </appender>