Spring Boot

[Spring Boot] 개발환경 설정 -(6) profile별 로그 설정하기(hibernate 등)

DEV_HEO 2022. 11. 1. 21:21
320x100

회사에서 System.out.println 보다 debug 쓰는게 너무 편리하고

개발서버나 운영서버에서 로그를 볼 수 있기 때문에

미루던 로그 설정을 해보려고 한다.

 

https://awse2050.tistory.com/72

https://goddaehee.tistory.com/206

 

위 블로그들 설명이 아주 자세하다.

 

https://zzang9ha.tistory.com/399

이 블로그는 hibernate 로그 설명이 잘 되어있다.

 


yml 으로도 설정 할 수 있지만 logback-spring.xml을 생성해서 설정하겠다.

 

결론적으로는 어떤 것을 사용해도 아무 문제가 없고, 기본적인 구조는 비슷하기 때문에 편한 것을 사용하면 되겠다. 개인적으로는 yml을 사용하는 것이 더 구조를 파악하기 쉽고, 중복되는 코드가 줄어들기 때문에 yml을 사용하는 것이 더 좋다고 생각한다.


주의할 점은 properties와 yml을 함께 사용하면 properties 파일이 우선순위가 높아 yml 파일에서 설정한 내용이 덮어씌워질 수 있다는 점이다. 따라서 되도록이면 둘 중 한쪽만 사용하는 것이 권장된다.

 

 

위 블로그들을 참고해서 내 입맛에 맞는 로그파일 설정을 해주었다.

 

- [날짜/날짜_시간_log.log] 형태로 로그파일을 생성


1. application.yml 설정

spring:
  profiles:
    active: ${profile}
    
  jpa:
    properties:
      hibernate:
        show_sql: false   # true=>콘솔에 표시
        format_sql: true  # 쿼리 들여쓰기 등 포맷에 맞춰 표출
        use_sql_comments: true # 주석 표시
       
#########################################

logging:
  level:
    root: WARN
    com:
      (프로젝트 패키지명): DEBUG
    #org:
    #  springframework:
    #    boot:
    #      autoconfigure: WARN
    #    beans:
    #      factory:
    #        support:
    #          DefaultListableBeanFactory: WARN
      hibernate:
        sql: DEBUG  
        type:
          descriptor:
            sql: trace # 파라미터 값 표출

 

spring:jpa:properties:hibernate:show_sql과

logging:level:hibernate:sql 의 차이점은

 

전자는 콘솔에 찍히는 것이고,  후자는 로그로 찍히는 것이다.

show_sql=true로 하고선 왜 콘솔에 sql문이 두 번 찍혔나 했었는데 그 이유 때문이었다.

 

로그 파일에 남길 예정이므로 shoq_sql=false로 설정한다.

 

또, 로그 설정한 후 엄청난 양의 디버그가 찍혔는데 다 필요 없는 내용이라 안보이게 하기 위해 

로그 레벨을 WARN 으로 해주었다.

일일이 지정해 주어도 되지만

아예 root를 WARN으로 지정해주고, 필요한 로그만 레벨을 설정해 주었다.


2. logback-spring.xml 생성

logback-spring.xml 파일을 생성하기 앞서

 

profile 별 로그 설정을 다르게 해주어야 하기 때문에

logback-local.properties 와 logback-prod.properties 를 만들 것이다.

 

· logback-local.properties

#로그파일 경로
log.config.path=D://log
#로그파일 이름
log.config.filename=log
#로그 레벨
log.config.level=DEBUG

 

 

· logback-prod.properties

#로그파일 경로
log.config.path=/log
#로그파일 이름
log.config.filename=log
#로그 레벨
log.config.level=INFO

 

· logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 15초마다 설정 파일의 변경을 확인 하여 변경시 갱신하려면 configuration scan="true" scanPeriod="15 seconds" -->
<configuration >
    <!-- application.yml 파일에서 spring.profiles.active 가져오기 -->
    <springProperty name="profile" source="spring.profiles.active" defaultValue=""/>

    <!-- profile 별 로그 설정 -->
    <property resource="logback-${profile}.properties"/>


    <!-- log file path -->
    <timestamp key="BY_DATE" datePattern="yyyyMMdd"/>
    <timestamp key="BY_TIME" datePattern="HH"/>
    <property name="LOG_PATH" value="${log.config.path}"/>
    <!-- log file name -->
    <property name="LOG_FILE_NAME" value="${log.config.filename}"/>
    <!-- err log file name -->
    <property name="ERR_LOG_FILE_NAME" value="${error.log.config.filename}"/>
    <!-- log level filter -->
    <property name="LOG_LEVEL" value="${log.config.level}"/>
    <!-- log pattern -->
    <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss} [%thread] [%logger{0}-%M:%line] - %msg%n "/>

    <!-- Console Appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>


	<!-- File Appender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 파일경로 설정 -->
        <file>${LOG_PATH}/${BY_DATE}/${BY_DATE}_${LOG_FILE_NAME}.log</file>

        <!-- 지정한 로그 레벨보다 같거나 높은 수준의 로그 레벨에 대해서는 로그를 처리. 지정한 로그 레벨보다 낮은 수준의 로그는 거부 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${LOG_LEVEL}</level>
        </filter>

           <!-- 출력패턴 설정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>

		<append>true</append>
        <!-- Rolling 정책 (파일 관리설정) -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
            <fileNamePattern>${LOG_PATH}/%d{yyyyMMdd}/%d{yyyyMMdd}_${LOG_FILE_NAME}_%i.log</fileNamePattern>

			<!--    파일 크기 지정할떄 사용 -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>

            <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>10</maxHistory>
            <!--<MinIndex>1</MinIndex> <MaxIndex>10</MaxIndex>-->

        </rollingPolicy>
	</appender>

    <root>
	    <appender-ref ref="CONSOLE"/>
	    <appender-ref ref="FILE"/>
   	</root>


</configuration>

 

에러 내용도 전부 한 로그파일에 담을 거라서 별도로 에러 로그 설정을 하지 않았다.

 

application.profiles.active 에서 지정된 profile을 
<springProperty name="profile" source="spring.profiles.active" defaultValue=""/>

 

profile 에 할당하면
<property resource="logback-${profile}.properties"/>

 

일일이 logback-spring.xml 파일을 변경해주지 않아도 되고,

profile 별 설정파일만 수정하면 된다.

320x100