공부기록

logback log level 설정 본문

일단써

logback log level 설정

코타쿠 2022. 6. 19. 23:23
<configuration scan="true" scanPeriod="60 seconds">
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-default}"/>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>
    <logger name="jdbc" level="OFF"/>
    <logger name="jdbc.connection" level="OFF"/>
    <logger name="jdbc.sqlonly" level="OFF"/>
    <logger name="jdbc.sqltiming" level="OFF"/>
    <logger name="jdbc.audit" level="OFF"/>
    <logger name="jdbc.resultset" level="OFF"/>
    <logger name="jdbc.resultsettable" level="OFF"/>
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

로거들은 자신에게 요청하는 코드의 레벨이 맞을 때 로그를 뱉는다.

이 글을 쓰는 이유는 root의 레벨에 따라 logger가 필터링 되는줄 알아서 쓴다....
내가 경험한 문제는 jdbc.sqltiming을 root가 debug 레벨일 때에 출력하고 싶었던 것이었다. 하지만 애초에 내가 logback의 요청 수용 방식, root 와 logger의 상속관계가 무엇인지 몰라서 벌어진 일이었다.
일단 logback의 logger들은 요청을 받는다. ALogger.debug() 뭐 이런 식으로 요청을 받는데 이 때 ALogger의 레벨이 debug 이하여야 수용할 수 있다는 것이다. ALogger의 레벨이 만약 info 이상이라면 ALogger.debug() 요청은 무시될 것이다.
그리고 root와 logger들은 서로 level을 상속할 뿐, root가 level에 따라 logger를 필터링하고 그런 것은 없다. level 상속도 내가 정하면 내가 정한 레벨로 되고 상속한 레벨은 무시된다.