본문 바로가기
자바(Java)

Java 로깅 알아보기 2 - logback

by codeyaki 2023. 8. 4.
반응형

2023.08.04 - [자바(Java)] - Java 로깅 알아보기 1 - Logging이란

기본적인 내용은 이전 글을 통해 확인하는 것을 추천!

Log4j 구조

  • Logger : 로그의 주체, 로그의 메시지 전달, 특정 패키지 안의 특정 레벨 이상만 출력
  • Appender: 어디에 출력할지에 대해 기술
  • Encoder: 어떻게 출력할지에 대해 기술

Logback 환경 설정 (logback.xml)

resources 하단에 logback.xml 파일 생성

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    	<filter class="com.example.test.config.LogbackFilter"/>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight([%-5p]) --- [%F]%M\\(%L\\) : %m%n</pattern>
        </encoder>
    </appender>
    
    <logger name="com.example" level="DEBUG" />
    <logger name="com.zaxxer.hikari.HikariDataSource" level="error"/>
    <logger name="com.example.test.mapper.**" level="error"/>
    <logger name="org.springframework" level="error"
        additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>
    
    <root level="INFO" >
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
  • <property name="LOGS_ABSOLUTE_PATH" value="./logs" /> 속성 설정
  • appender 부분은 출력위치를 결정해 주고 (STDOUT), Appender로 사용할 클래스를 설정해 주는 부분이다.
  • filter는 로그를 남길 때 사용할 필터를 설정한다.
  • encoder는 어떠한 형태로 출력할지 결정해 준다.
  • logger는 각 패키지에서 어떤 레벨 이상의 로그를 출력할지 선택
  • root는 logger에 해당되지 않는 이외에서 동작할 레벨을 선택 (default)

Conversion Word

https://logback.qos.ch/manual/layouts.html#conversionWord

  • C{length}, lo{length}, logger{length}length가 로거의 이름보다 짧아도 가장 오른쪽 세그먼트의 길이는 축약되지 않는다.
    • %logger - mainPackage.sub.sample.Bar
    • %logger{0} - Bar
    • %logger{5} - m.s.s.Bar
    • %logger{10} - m.s.s.Bar
    • %logger{15} - m.s.sample.Bar
    • %logger{16} - m.sub.sample.Bar
    • %logger{26} - mainPackage.sub.Bar
  • ex) mainPackage.sub.sample.Bar라는 로거를 사용할 때
  • : 로거 이벤트를 출력하는 로거의 이름
  • contextName, cn
  • : 이벤트의 출처에 있는 로거가 포함되어 있는 콘텍스트의 이름 출력
  • d{pattern}, date{pattern}, d{pattern, timezone}, date{pattern, timezone}, d{pattern, timezone, locale}, date{pattern, timezone, locale}DateTimeFormatter 형식과 호환된다.
    • %d - 2006-10-20 14:06:49,812
    • %date - 2006-10-20 14:06:49,812
    • %date{ISO8601} - 2006-10-20 14:06:49,812
    • %date{dd MMM yyyy;HH:mm:ss.SSS} - 20 oct. 2006; 14:06:49.812
  • ex) 날짜가 2006년 10월 20일 금요일일 때
  • : 로깅 이벤트의 날짜 출력
  • F, file
  • : 로깅이 발생한 Java 소스 파일의 이름 (성능 저하)
  • caller{depth}, caller{depthStart..depthEnd}, caller{depth, evaluator-1, ... evaluator-n}, caller{depthStart..depthEnd, evaluator-1, ... evaluator-n} 일반적으로 호출 메서드의 정규화된 이름, 호출자의 소스, 파일이름 및 괄호 사이의 줄 번호
    • %caller{2} -
    • 0 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.;sample.Bar.sampleMethodName(;Bar.java:22) Caller+1 at mainPackage.sub.;sample.Bar.createLoggingRequest(;Bar.java:17)
    • %caller{3}
    • 16 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.;sample.Bar.sampleMethodName(;Bar.java:22) Caller+1 at mainPackage.sub.;sample.Bar.createLoggingRequest(;Bar.java:17) Caller+2 at mainPackage.ConfigTester.;main(ConfigTester.;java:38)
    • caller{1..2}
    • 0 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.;sample.Bar.createLoggingRequest(;Bar.java:17)
    • L, Line
    • 로깅 이벤트가 발생한 줄 번호 (성능 저하)
    • m, msg, message
    • : 로깅 메시지 출력
    • M, method
    • : 로깅을 요청한 메서드 이름 (성능 저하)
    • n
    • : 개행 문자 삽입 (줄 바꿈)
    • p, le, level
    • 이벤트의 레벨 (DEBUG, WARN, ERROR 등…)
    등등 이외에도 많은 내용이 있으니 공식문서 참고
  • ex)
  • : 로깅 이벤트를 발생시킨 호출자의 위치 정보

포맷 지정하기

https://logback.qos.ch/manual/layouts.html#formatModifiers

  • 양수는 왼쪽 음수는 오른쪽 정렬
  • 0 이상 자리는 미만일시 채우기, 소수점 자리는 초과하면 자르기
  • ex)

컬러 지정하기

https://logback.qos.ch/manual/layouts.html#coloring

레벨에 따라 자동적으로 컬러를 지정되도록 하고 싶다면 %highlight 사용

ex)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>

<configuration debug="true">
  <import class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"/>
  <import class="ch.qos.logback.core.ConsoleAppender"/>

  <appender name="STDOUT" class="ConsoleAppender">
    <withJansi>true</withJansi>
    <encoder class="PatternLayoutEncoder">
      <pattern>[%thread] %highlight(%-5level) %cyan(%logger{15}) -%kvp -%msg %n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

logback.xml vs logback-spring.xml

그냥 logback은 spring이 시작되기 전에 로드되기 때문에 application.properties(.yml)의 정보를 읽을 수 없다.

 

로그 레벨 중요도

TRACE < DEBUG < INFO < WARN < ERROR

반응형