Web & Server/Spring & Spring Boot

Spring Boot - (8) Logback 상세화하기

Simplify - Jonghun 2018. 10. 8. 18:30

GitHub 소스 위치 : https://github.com/Simplify-study/SpringBootSample.git


Spring Boot 를 실행하면 로그가 잘 나옵니다. Eclipse (STS) 기준 Console View에 잘 나옵니다. Spring Boot 에는 기본적으로 Logback 이 포함되어 있기 때문에 아무런 작업 없이도 로그가 잘 나타납니다. 그런데 실제 환경에서는 이러한 Stream 형태의 Log는 아무런 의미가 없습니다. 왜냐하면 서버에 문제가 발생한 경우, 이를 추후에 Trace 할 방법이 없기 때문입니다. 따라서 결국 Log는 특정 폴더에 파일 형태로 남기게 되고, 이를 날짜별로 분류하거나, 용량별로 나눠서 남기게 됩니다. 


Spring Boot 에 기본적으로 Logback이 포함되어 있기 때문에 라이브러리 쪽에 아래 그림처럼 나타납니다. 




Dependency 추가하기


기본 logback 은 포함되어 있으나, jdbc에 대한 logback 설정은 되어 있지 않기 때문에 이 부분은 추가로 설정해 줍니다.


1
2
3
4
5
6
7
        <!-- DB Logback -->
        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
            <version>1.16</version>
        </dependency>
        <!-- DB Logback -->
cs


그리고 resources 폴더 아래에 log4jdbc.log4j2.properties 파일을 아래와 같이 생성합니다. 


1
2
3
4
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
 
 
cs



DB 설정 정보 수정하기


기 작성되어 있었던 config.properties 파일에 다음과 같이 수정합니다. 


1
2
3
4
#spring.datasource.driverClassName=org.mariadb.jdbc.Driver
#spring.datasource.url=jdbc:mariadb://52.78.41.121:3306/TestDB
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:mariadb://52.78.41.121:3306/TestDB
cs



application.properties 를 application.yml 로 수정, 프로파일 추가하기


다음과 같이 파일명을 변경하고 application.yml 파일을 수정합니다. 각각의 프로파일은 logging path 를 다르게 가지고 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
 
logging:
  path: c:/dev/log/spring
  file: log-file  
  
---
spring:
  profiles: log-windows
  
logging:
  path: c:/dev/log/spring
---
spring:
  profiles: log-linux
  
logging:
  path: /log/spring/
cs



Logback 설정 파일 추가하기


Spring Boot를 사용하면서 logback 설정 파일을 추가하려면 이름을 반드시 logback-spring.xml 로 설정해 주세요. 그냥 logback.xml 로 넣어도 동작하는 것 처럼 보이지만, 설정 파일이 최초에 불려지지 않고, 타이밍 이슈가 발생하여 실제 application.properties 등에 설정해둔 log 폴더 등이 제대로 동작하지 못하는 문제가 발생합니다. 아래와 같이 logback 을 만들어 주었습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
 
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    
    <springProfile name="log-jdbc">
        <logger name="jdbc" level="OFF"/>
        <logger name="jdbc.sqlonly" level="OFF"/>
        <logger name="jdbc.sqltiming" level="DEBUG"/>
        <logger name="jdbc.audit" level="OFF"/>
        <logger name="jdbc.resultset" level="OFF"/>
        <logger name="jdbc.resultsettable" level="DEBUG"/>
        <logger name="jdbc.connection" level="OFF"/>
    </springProfile>
    
    <springProfile name="log-file">
        <include resource="appenders/appender-file.xml" />
          <root level="INFO">
            <appender-ref ref="FILE" />
          </root>
    </springProfile>
    
    <springProfile name="log-console">
        <include resource="appenders/appender-console.xml" />
          <root level="INFO">
              <appender-ref ref="CONSOLE" />
          </root>
    </springProfile>
</configuration>
cs


 지저분하게 늘어서는 것을 방지하기 위해서 appender 부분은 별도 파일로 빼 놓았습니다. appenders/appender-file.xml 및 appenders/appender-console.xml 파일을 아래와 같습니다. 각각 resources 폴더 아래에 둡니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<included>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE}.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>
</included>

cs


1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{MM-dd HH:mm:ss.SSS} %clr(${LOG_LEVEL_PATTERN:-%5p}) [%t] %clr(%-40.40logger{39}){cyan} | %msg%n</pattern>
        </encoder>
    </appender>
</included>
cs



구동 profile 등록하기 


위에 선언한 것 처럼 각 profile을 걸맞게 Run Configuration에 추가해 줍니다. 



프로파일에 log-file 을 추가해 구동해보고 해당 경로에 파일이 생기는지 확인해 봅니다.