헤르메스 LIFE

[Spring] Log4J 사용 시 쿼리 로그가 두 번 찍히는 경우 본문

Spring Framework

[Spring] Log4J 사용 시 쿼리 로그가 두 번 찍히는 경우

헤르메스의날개 2021. 1. 14. 21:40
728x90

쿼리 로그가 두 번 찍힙니다.

Root Logger 와 jdbc.sqlonly 가 각각 한번씩.. 두번 찍히게 되는데요.

jdbc.sqlonly에서 SQL Logger를 찍고 상위 root Logger 로 가는 걸 방지하기 위해 additivity="false" 를 붙이시면 해결됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C{1.}}{bright,yellow}: %msg%n%throwable"/>
        </Console>

        <RollingFile name="RollingFile"
                     fileName="./logs/spring-boot-sample.log"
                     filePattern="./logs/spring-boot-sample-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- rollover on startup, daily and when the file reaches
                    10 MegaBytes -->
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy
                        size="10 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>

        <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>
        <Logger name="jdbc.sqlonly" level="INFO" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>

        <!-- log4jdbc logging -->
        <Logger name="jdbc" level="error" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>
        <Logger name="log4jdbc.log4j2" level="error" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>

        <Logger name="com.rest" level="debug" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Logger>

        <!-- LOG everything at INFO level -->
        <Root level="info">
            <AppenderRef ref="console"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>

</Configuration>

additivity="false" 를 붙였는데 두번 찍히는 경우...

log4jdbc-log4j2-jdbc4 를 사용하는 경우인 듯 합니다.

jdbc.sqltiming 과 jdbc.sqlonly 두 개가 각각 찍는 경우 입니다.

마찬가지로 두 번 찍힙니다.

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

 

 

728x90