ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [설정] Spring boot 2 Logback 설정
    Spring/Spring Boot 2019. 1. 30. 14:31
    반응형

    프로젝트 생성할때마다 가장 귀찮은것중 하나가 로그 설정 같다. 그냥 롤링정도만 하면 괜찮은데 로그 수집용, 용도별 등등 분류해서 쌓아야 할경우가 많았고 Spring framework 를 사용할땐 한상 만들어놓은 app.properties 를 복붙해서 별신경 안쓰고 쓰던거 같다 ( 그래서 그런지 잘 못외움... 뭐하는건지검색해야 아맞다 싶음). 


     그래서 기본적인것만 블로그에 남겨 둔다. 나중에 검색하는 수고로움을 좀더 줄이기 위해 .... 


    spring:
    profiles :
    active : prod
    scribed : test
    scheduler :
    type : master
    web :
    url :
    parttern :

    servlet:
    multipart:
    max-file-size: 30MB
    max-request-size : 30MB


    logging:
    config: classpath:logback-spring.xml

    일단 application.yml 에 logging 값을 설정하고 logback 사용을 위한 xml 을 지정 한다. ( logback-spring.xml 이라는 명을 지키고 application.yml 과 같은 레벨에 둔다 . Spring boot에서 logback.xml 로 사용할 경우 설정우선순위에 밀려서 설정이 안먹힐수 있다. )



    <!-- mybatis log4jdbc-log4j2 라이브러리 -->
    <dependency>
    <groupId>com.googlecode.log4jdbc</groupId>
    <artifactId>log4jdbc</artifactId>
    <version>1.2</version>
    </dependency>

    라이브러리는 구글에서 만든걸로 사용했다. log4jdbc 라는 이름으로 생각보다 다양한곳에서 만들어진 라이브러리들이 있었다. 난 믿음의 구글로 사용하였다. ! 

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">



    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>log/apilog-%d{yyyy-MM-dd}.%i.txt.zip</fileNamePattern>
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    <!-- or whenever the file size reaches 100MB -->
    <maxFileSize>100MB</maxFileSize>
    </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
    <pattern>%d{HH:mm:ss.SSS}-%green(%-5level)-%logger{36} - %msg%n</pattern>
    </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
    <Pattern>%d{HH:mm:ss.SSS}-%green(%-5level)-%logger{36} - %msg%n</Pattern>
    </layout>
    </appender>


    <appender name="FLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>flonetd/flog-%d{yyyy-MM-dd}.txt.zip</fileNamePattern>

    </rollingPolicy>
    <encoder>

    <pattern>%5p [%d] %msg%n</pattern>
    </encoder>
    </appender>


    <!-- Loggers -->
    <logger name="org.springframework.core">
    <level value="info"/>

    </logger>
    <logger name="org.springframework.beans">
    <level value="info"/>

    </logger>
    <logger name="org.springframework.context">
    <level value="info"/>

    </logger>
    <logger name="org.springframework.web">
    <level value="info"/>

    </logger>
    <logger name="com.example.web">
    <level value="debug"/>

    </logger>
    <logger name="java.sql">
    <appender-ref ref="ROLLING"/>
    <appender-ref ref="STDOUT"/>
    <level value="info"/>

    </logger>


    <!-- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다. -->
    <logger name="jdbc.sqlonly" additivity="false">
    <appender-ref ref="ROLLING"/>
    <appender-ref ref="STDOUT"/>
    <level value="info"/>


    </logger>
    <!-- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. -->
    <logger name="jdbc.sqltiming" additivity="false">
    <!--<appender-ref ref="ROLLING"/>-->
    <!--<appender-ref ref="STDOUT"/>-->
    <!--<level value="info"/>-->
    </logger>
    <logger name="jdbc.resultset" additivity="false">
    <!--<appender-ref ref="ROLLING"/>-->
    <!--<appender-ref ref="STDOUT"/>-->
    <!--<level value="info"/>-->

    </logger>
    <logger name="jdbc.resultsettable" additivity="false">
    <appender-ref ref="ROLLING"/>
    <appender-ref ref="STDOUT"/>
    <level value="debug"/>

    </logger>
    <logger name="jdbc.connection" additivity="false">
    <appender-ref ref="ROLLING"/>
    <level value="fetal"/>
    </logger>
    <logger name="jdbc.audit" additivity="false">
    <!--<appender-ref ref="ROLLING"/>-->
    <!--<appender-ref ref="STDOUT"/>-->
    <!--<level value="info"/>-->
    </logger>

    <logger name="flunetd" additivity="false" >
    <appender-ref ref="FLOG"/>


    <level value="info"/>
    </logger>

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


    STDOUT 과 FLOG 두가지를 남길 것이다. 기본적으로 appder 의 종류는 RollingFileAppender 로 지정한다 다른것들이 많지만 범용적으로 쓰기엔 딱좋다. 


     maxFileSize : 로그를 용량 단위로 분할함. ( vim 으로 로그를 보거나 옴길때 좋다. 용량이 크면 잘 안열리니까 ) 

     pattern : 출렬 패턴이다. 생각보다 다양하게 사용이 가능하다 ( 제약적이지만 ) STOUT 에서쓰는 패턴과 FLOG 에서 쓰는 패턴을 보면 용도가 다르기 때문에 서로 다르게 포맷팅이 되있다. 


    그외에 <logger></logger> 로 정의 되있는것들은 spring 자체 메세지 처리를 위한 설정 값들이다 . core 내용이 보기 싫으면 제거하면 되는거 같다. 


    그리고 jdbc 관련 로그 설정들이 그 뒤에 이어진다. 

    driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

    개인적으로 이 드라이버를 사용중이기때문에 쿼리문에 대한 결과 값을 로그로 찍기 위해 설정을 더 해놓았다. 


    쿼리문이 실행된 시간(sqtiming), 실제 실행된 쿼리문(audit), 쿼리결과 (resultset) , 쿼리결과를 표로(resultsettable)등을 설정할수있고 logback에서 제공하는 레벨로 로깅 컨트롤이 가능하다 . 


     개인적으로 일반적으로 디버깅에 필요한건 info 로 찍고 잡다한건 debug 로 찍어 놓는데 맨아래 root level 에 레벨을 설정해 놓으면 기본적으로 최우선으로 적용되는것 같다 ( 맞나 -_-a ;; ) 


    properties 보단 xml 이 개인적으로 보기는 어렵지만 그래도 properties 가 오래되었기에 그나마 최신(?) xml 을 사용해 봐야겠다 

    반응형
Designed by Tistory.