사용자 도구

사이트 도구


java:log4j:pattern

Log4j 로그 패턴

패턴

  • %p debug, info, warn, error, fatal 등의 priority 가 출력된다.
  • %m 로그내용이 출력됩니다
  • %d 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 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와 관련된 MDC(mapped diagnostic context)를 출력합니다. %X{key} 형태.

공백 패딩

  • %5p : 우측 정렬로 로그 레벨을 남김. 로그레벨이 5글자가 안되면 왼쪽에 공백을 추가하여 5글자 맞춤.
  • %-5p : 좌측 정렬.

hostname 패턴 확장

아래는 %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>
java/log4j/pattern.txt · 마지막으로 수정됨: 2015/11/15 16:18 저자 kwon37xi