Link
Today
Total
12-01 00:21
Archives
관리 메뉴

초보개발자 긍.응.성

Logback - 6. Layouts (2). PatternLayout 본문

Spring/Logback

Logback - 6. Layouts (2). PatternLayout

긍.응.성 2020. 10. 5. 23:41
반응형
logback

logback 홈페이지의 매뉴얼을 읽으며 내용들을 정리한 글입니다.

PatternLayout

PatternLayout은 가장 유연하게 사용되는 Logback-classic 모듈의 layout입니다. PatternLayout은 이벤트를 입력한 문자열 패턴에 맞추어 변환합니다. 이때 PatternLayout에 입력한 문자열을 변환 패턴(Conversion Pattern)이라 합니다.

PatternLayout의 변환 패턴은 C언어의 printf() 함수와 매우 유사합니다. 변환 패턴은 리터럴 텍스트(literal text)와 변환 지정자(conversion specifiers)로 구성됩니다. 리터럴 텍스트는 변환 패턴 문자열에 삽입되어 삽입된 문자 그대로 출력됩니다. 변환 지정자는 퍼센트 기호 '%'로 시작되며 그 뒤에 conversion word가 등장합니다. 또한, 선택적으로 format modifiers파라미터를 포함한 중괄호를 가집니다 (ex. %logger{26} 최대 26자로 로거 이름 출력).

Conversion Words

대표적으로 사용되는 Conversion Words에 대하여 정리하겠습니다. 모든 Conversion Words에 대하여 확인하고 싶으시다면 이 링크를 확인해주세요. 하나의 셀에 있는 conversion Word들은 모두 같은 역할을 합니다.

Conversion Word Effect
c{length}
lo{length}
logger{length}
로거의 이름을 출력한다.
- length를 입력하지 않은 경우: 전체 로거 이름을 출력한다.
- length == 0: 클래스 이름만 출력
- length != 0: 패키지 이름과 클래스 이름을 최대 length 길이만큼 출력한다. 전체 이름이 length 보다 길다면 패키지 경로의 명을 첫 글자로만 단축해서 출력한다.

- mainPackage.sub.sample.Bar
ex) %logger{15} = m.s.sample.Bar
ex) %logger{5} = m.s.s.Bar

d{pattern}
date{pattern}
d{pattern, timezone}
date{pattern, timezone}
로그 이벤트가 발생한 시간을 pattern에 맞추어 출력한다.
pattern 포맷은 SimpleDateFormat을 따른다.

default timzone은 ISO 8601 date format이다.
p
le
level
로깅 이벤트의 레벨을 출력한다
t
thread
로깅 이벤트 발생시킨 쓰레드 이름을 출력한다
r
relative
Application 시작 이후 로그 이벤트 발생까지 소요 시간을 출력한다.
L
line
로그 요청이 일어난 라인 번호를 출력한다.
이 값을 요청하면 속도에 이슈가 있을 수 있으니 고려해서 사용해야한다.
m
msg
message
로그 메시지를 출력한다.
M
method
로그 이벤트를 발생시킨 메서드 명을 출력한다
n 개행 문자를 삽입한다.
퍼센트 기호 '%' 는 Conversion Word를 위한 특수문자로 취급받기 때문에 퍼센트 기호를 그대로 출력하고 싶다면 '\%'로 사용해야만 합니다.

Logback pattern parser는 % 이후 등장하는 conversion word 구분자가 없을 때 혼동이 일어날 수 있습니다. 예를 들어, "%date%nHello"와 같은 패턴은 %date%nHello 두 개의 conversion word로 파싱 됩니다. Logback pattern parser를 원하는 대로 동작시키고 싶다면 conversion word 마다 구분을 시켜주어야 합니다. 위의 예제를 수정한다면 패턴을 "%date%n{}Hello"로 수정합니다. 중괄호를 활용해 %n에 빈 파라미터를 넣어주는 방법이며, 이를 통해 %date%n 이후 리터럴 문자 Hello로 파싱 되도록 합니다.

Format modifiers

PatternLayout은 옵션으로 format modifiers를 사용할 수 있습니다. format modifiers은 conversion word 출력 시 필드가 차지할 최대 및 최소 너비와 맞춤을 지정합니다. format modifiers은 '%'뒤 conversion word 앞에 위치합니다.

format modifiers은 다음과 같이 구성됩니다.

Left justify Minimum width . Maximum width

각 플래그는 모두 생략 가능하며 Maximum width지정을 위해서는 dot(.)이 필수적으로 명시되어야 합니다.

Name Input Type Description
Left justify 마이너스 기호 (-) (-) 기호를 이용하며 왼쪽 정렬을 의미합니다. 기본은 오른쪽 정렬입니다.
Minimum width Integer 최소 필드 너비를 의미합니다.
Maximum width가 지정되지 않았으면, 출력 문자열이 더 길 경우 잘리지 않고 모두 출력됩니다.
Maximun width Integer 최대 필드 너비를 의미합니다.

사용 예시는 아래와 같습니다. Maximum width 앞의 마이너스 부호는 최대 필드 너비를 넘어갈 때 잘리는 문자열의 위치를 의미합니다. 아무 기호가 붙지 않은 세 번째 예시의 경우 기본으로 오른편의 10개의 문자를 출력하고 나머지 왼쪽 부분의 문자열은 잘라냅니다. 반대로 (-) 기호가 붙은 네 번째 예시는 왼쪽부터 10개의 문자를 출력하고 나머지 오른쪽 부분을 생략합니다. 

Format modifier Logger name Result
[%20.20logger] main.Name [           main.Name]
[%-20.20logger] main.Name [main.Name           ]
[%10.10logger] main.foo.foo.bar.Name [o.bar.Name]
[%10.-10logger] main.foo.foo.bar.Name [main.foo.f]

로그 레벨에 format modifiers 적용

%level로 TRACE, DEBUG, WARN, INFO, ERROR 전체를 출력하는 대신 첫 단어 T, D, W, I, E만 짧게 출력하고 싶을 때 format modifiers를 사용할 수 있습니다. "%.-1level"로 지정할 시 왼쪽부터 1개의 문자, 즉 로그 레벨의 첫 문자만 출력할 수 있습니다.

Conversion word 옵션

conversion word 뒤에 파라미터를 포함한 중괄호를 붙여 여러 옵션들을 지정할 수 있습니다. 이는 예시와 함께 살펴보겠습니다.

<pattern>%replace(%logger %msg){'\.', '/'}</pattern>

replace는 replace(p){r, t} 규칙을 갖는 conversion word입니다. p문자열에 대하여 r패턴과 일치하는 부분을 t로 대체하여 출력하는 역할을 합니다. 로거 이름과 로그 메시지 중 모든 dot(.) 문자는 슬래시(/)로 대체되어 출력될 것입니다.

소괄호를 이용한 변환 패턴

Logback에서 소괄호에 둘러싸인 패턴 문자열은 하나의 묶인 토큰으로 간주됩니다. 한 개 이상의 conversion words를 그룹으로 묶어 패턴을 적용할 수 있습니다. 아래의 설정은 왼쪽부터 시간과 쓰레드명을 합쳐 최소 너비 30자로 출력합니다. 

%-30(%d{HH:mm:ss.SSS} [%thread]) %-5level %logger{32} - %msg%n

Coloring

PatternLayout은 색깔과 관련된 conversion word를 갖고 있습니다. 종류는 "%black", "%red", "%green", "%yellow", "%blue", "%magenta", "%cyan", "%white", "%gray", "%boldRed", "%boldGreen", "%boldYellow", "%boldBlue", "%boldMagenta", "%boldCyan", "%boldWhite", "%highlight"이며 소괄호를 이용하여 적용하려고 하는 로그 패턴 부분을 감싸주어 적용할 수 있습니다.

이 중 "%highlight"는 로그 레벨에 따라 다른 색깔을 표현합니다. ERROR에 진한 빨강, WARN에 빨강(document에는 빨강이라는데 갈색 같다...), INFO에 파랑, 나머지 레벨에 기본 색깔로 지정합니다.

<configuration debug="true">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <withJansi>true</withJansi>
    <encoder>
      <pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n</pattern>
    </encoder>
  </appender>
  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

설정의 예시는 위와 같습니다. <withJansi>true</withJansi>를 통해 ANSI color code 해독을 위한 Jansi 라이브러리를 추가합니다. 콘솔에 출력될 때 기본 터미널이 아닐 경우 호환성 문제를 Jansi 라이브러리가 해결해줍니다. 단, Window의 경우 classpath에 org.fusesource.jansi:jansi:1.17 이상 버전이 필요합니다. 예시 출력 결과는 아래와 같습니다.

반응형
Comments