참고 블로그
개발 환경(dev)에서는 INFO 로그 레벨로 콘솔로 출력하도록, 배포 환경(prod)에서는 ERROR 로그만 따로 볼 수 있도록 별도의 파일로 저장되고 슬랙으로 알림이 오도록 설정하였습니다.
1. SLF4J(Simple Logging Facade For Java)
2. 로그 설정
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_DIR" value="./logs"/> <property name="LOG_PATH_NAME" value="${LOG_DIR}/data/"/> <property name="ERROR_LOG_PATH_NAME" value="${LOG_DIR}/error/"/> <property name="LOG_PATTERN_CONSOLE" value="%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %highlight([ %-5level]) | %cyan(%logger{35}) - %msg%n"/> <property name="LOG_PATTERN_FILE" value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n"/> <property name="MAX_HISTORY" value="7"/> <!-- 콘솔 출력 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN_CONSOLE}</pattern> </encoder> </appender> <!-- 파일로 저장--> <appender name="DATA" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH_NAME}data_%d{yyyyMMdd}.log</fileNamePattern> <maxHistory>${MAX_HISTORY}</maxHistory> </rollingPolicy> <encoder> <pattern>${LOG_PATTERN_FILE}</pattern> </encoder> </appender> <!-- 에러의 경우는 별도 파일 저장 --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${ERROR_LOG_PATH_NAME}error_%d{yyyyMMdd}.log</fileNamePattern> <maxHistory>${MAX_HISTORY}</maxHistory> </rollingPolicy> <encoder> <pattern>${LOG_PATTERN_FILE}</pattern> </encoder> </appender> <!-- profile 에 따라 slack 에 전송 --> <springProfile name="prod"> <property resource="application-dev.yml" /> <appender name="SLACK_ERROR" class="com.github.maricn.logback.SlackAppender"> <webhookUri>${webhook-uri}</webhookUri> <channel>#${channel}</channel> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_PATTERN_FILE}</pattern> </layout> <username>${username}</username> <iconEmoji>:${emoji}:</iconEmoji> <colorCoding>true</colorCoding> </appender> <appender name="ASYNC_SLACK_ERROR" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="SLACK_ERROR"/> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> </appender> </springProfile> <!-- logger 설정 --> <springProfile name="prod"> <logger name="com.prgrms.needit" level="INFO" additivity="false"> <appender-ref ref="DATA"/> </logger> <logger name="com.prgrms.needit" level="ERROR" additivity="false"> <appender-ref ref="ERROR"/> <appender-ref ref="ASYNC_SLACK_ERROR"/> </logger> </springProfile> <!-- 위의 logger 에 해당하지 않으면(dev 개발 환경) 기본 설정 --> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration>
3. 에러 로그 슬랙으로 남기기


application-prod.yml 에 슬랙 설정 추가
... webhook-uri: ${WEBHOOK_URI} channel: need-it-error-log username: ERROR LOG emoji: rotating_light ...
