본문으로 바로가기

Spring Boot - (4) logback 설정

category Backend/Spring 2020. 11. 23. 00:32
반응형

이전 포스팅에서 Database 연동까지 했었다.

이번에는 logback 설정을 해볼 것이다.


logback 설정

  • 자바 오픈소스 로깅 프레임워크, SLF4J의 구현체
  • 스프링 부트의 기본으로 설정되어 있어서 사용시 별도로 라이브러리를 추가하지 않아도 된다.
  • log4j, log4j2 등과 성능을 비교했을 때 logback이 더 훌륭한 성능을 보여준다.

이전 포스팅을 읽었다면 DB 설정은 이미 log4j로 변경된 설정값으로 되어있을 것이다.

log4j에 대한 설정 파일이 별도로 필요하다. application.yml과 같은 경로에 2개의 파일을 새로 만들고 각각 소스를 추가한다.


log4jdbc.log4j2.yml

  • 이쯤에서 다시 말하지만 .yml 확장자가 싫으면 기존 properties 확장자 사용해도 된다.
log4jdbc:
  spylogdelegator.name: net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
  dump.sql.maxlinelength: 0

위 파일은 sql 관련된 소스


logback.xml

<configuration scan="true" scanPeriod="30 seconds">

    <springProperty name="profileActive" source="spring.profiles.active" defaultValue="test"/>
    <springProperty name="logPath" source="logging.file.path" defaultValue="/var/log/tomcat/test"/>
    <springProperty name="logLevel" source="logging.level.root" defaultValue="INFO"/>

    <!-- Optional: to enable JMX setting of log levels
         cf http://logback.qos.ch/manual/jmxConfig.html -->
    <jmxConfigurator/>

    <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:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){green} %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>

    <!-- test 경우 로그파일을 남기지 않는다. -->
    <if condition='"${profileActive}".equals("test")'>
        <then/>
        <else>
            <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${logPath}/spring.log</file>
                <!-- file property left unset/blank -->
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>spring.%d{yyyy-MM-dd}.log</fileNamePattern>
                    <maxHistory>7</maxHistory>
                    <totalSizeCap>3GB</totalSizeCap>
                </rollingPolicy>

                <encoder>
                    <pattern>${CONSOLE_LOG_PATTERN}</pattern>
                    <charset>${CONSOLE_LOG_CHARSET}</charset>
                </encoder>
            </appender>
            <root level="${logLevel}">
                <appender-ref ref="FILE" />
            </root>
        </else>
    </if>

    <appender name="ATOMIKOS" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>${CONSOLE_LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- log4jdbc 옵션 설정 -->
    <logger name="jdbc" level="OFF" />
    <!-- 커넥션 open close 이벤트를 로그로 남긴다. -->
    <logger name="jdbc.connection" level="OFF" />
    <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
    <logger name="jdbc.sqlonly" level="OFF" />
    <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
    <logger name="jdbc.sqltiming" level="DEBUG" />
    <!--
        ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다.
        많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
    -->
    <logger name="jdbc.audit" level="OFF" />
    <!-- ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. -->
    <logger name="jdbc.resultset" level="OFF" />
    <!-- SQL 결과 조회된 데이터의 table을 로그로 남긴다. -->
    <logger name="jdbc.resultsettable" level="OFF" />

    <logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR" />
    <logger name="org.apache.catalina.util.LifecycleBase" level="ERROR" />
    <logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN" />
    <logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN" />
    <logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN" />
    <logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR" />
    <logger name="org.hibernate.validator.internal.util.Version" level="WARN" />
    <logger name="org.springframework.boot.actuate.endpoint.jmx" level="WARN" />

    <root level="${logLevel}">
        <appender-ref ref="CONSOLE" />
    </root>

    <!-- NOTE: logback does not support FATAL, only ERROR, WARN, INFO, DEBUG and TRACE -->
    <logger name="com.atomikos" level="ERROR">
        <appender-ref ref="ATOMIKOS" />
    </logger>

</configuration>

위 파일은 logback 상세설정 내용이다.

모두 적용한 다음 다시 실행해보면 Console에 찍히는 내용이 기존과 다를 것이다.

직접 설정값을 바꿔가며 확인해보면 좋을 것 같다.


Previous Chapter

Next Chapter

반응형