개발 환경에 따라 다른 log 형식을 지원해야 할 경우가 있습니다.
저는 이전 프로젝트 때 개발 환경에서는 콘솔에서만 로그가 보이길 원하고 배포 환경에서는 파일로 저장 되길 원했습니다. 그래서 logback을 공부해보았습니다.
Java 애플리케이션에서 사용되는 로깅 프레임워크입니다. Logback은 성능, 확장성, 유연성을 고려하여 셀계되어있습니다.

예시와 같이
src -> main -> resources -> logback-spring.xml
에 위치합니다.
저는 개발 환경을 dev와 prod로 나누어 관리하였습니다.
그래서 dev 사용할 경우와 prod를 사용할 경우를 나누어 관리하였습니다.<springProfile name="dev"> ~ </springProfile> <springProfile name="prod"> ~ </springProfile>springProfile 기능을 활용해 dev와 prod일 경우를 나눴습니다.
먼저 개발 환경에서의 설정을 보여드리겠습니다.
저는 기본 spring로그에 익숙하여 spring가 보이도록 설정하고
로그의 레벨은 info로 설정하였습니다.<springProfile name="dev"> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </springProfile>
배포 환경에서는 spring 로그를 콘솔에서 사용하고 파일로 저장, error는 또 파일로 추가로 저장하는 방법을 사용했다.
<configuration> <springProperty scope="context" name="LOG_DIR" source="log.directory" /> <timestamp key="BY_DATE" datePattern="yyyy-MM-dd" /> <configuration>
application.yml 파일에 log 파일의 저장 위치를 먼저 불러왔다.
log: directory: logs/prod
<springProfile name="prod">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/error/error-${BY_DATE}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/backup/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/info/info-${BY_DATE}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/backup/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE-ERROR" />
<appender-ref ref="FILE-INFO" />
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
root level를 조절하여 내가 원하는 log의 level을 1차로 설정할 수 있습니다.
appender에서 file을 통해 저장할 파일의 이름,
filter를 통해 level,
encoder을 통해 저장할 로그의 형태,
rollingPoilcy를 통해 back로그 관련 설정을 하였습니다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<springProperty scope="context" name="LOG_DIR" source="log.directory" />
<timestamp key="BY_DATE" datePattern="yyyy-MM-dd" />
<springProfile name="dev">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<springProfile name="prod">
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/error/error-${BY_DATE}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/backup/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/info/info-${BY_DATE}.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/backup/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE-WARN" />
<appender-ref ref="FILE-INFO" />
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
</configuration>
- springProfile 기능을 통해 개발 환경에 따라 구분하여 log를 관리할 수 있다.
- appender 기능을 통하여 log를 파일로 저장할 수 있다.
- rollingPolicy 정책을 통하여 backup도 설정할 수 있다.
- log 는 level이 있다.
- level 설정으로 보여주거나 저장할 로그를 설정할 수 있다.
저는 프로젝트를 진행할 때 MSA기반의 서버를 분리하여 개발을 진행했습니다. 그러면 만약 로그를 보기 위해서 각각의 서버를 들어가 파일을 보아야 하는 문제가 발생하였습니다. 이러한 문제를 해결하기 위해 여러가지를 찾아보니 Log & Crash란 기능이 있었습니다.
다음 글은 NHN의 LOG & Carsh 까지 사용하여 로그를 관리하는 방법을 올리도록 하겠습니다.