Intro::
로그백 설정을 통해 applicatoin.yml 보다 디테일한 설정을 할 수 있습니다.
<configuration>
<!-- 콘솔 출력 Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<!-- 콘솔 출력 포맷을 정의할 수 있습니다. -->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- INFO·WARN 전용 파일 Appender -->
<!-- rollingPolicy를 통해서 조건에 따른 로그 파일로 기록할 수 있습니다. -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>log/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>5</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<!-- LevelFilter를 통해서 원하는 단계의 로그만 남길 수 있습니다. -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{35} [%X{clientIp}] - %msg%n
</pattern>
</encoder>
</appender>
<!-- ERROR 이상 전용 파일 Appender -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>log/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>log/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>2GB</maxFileSize>
<maxHistory>5</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{35} [%X{clientIp}] - %msg%n%xException%n
</pattern>
</encoder>
</appender>
<!-- 비동기 Appender 래핑 -->
<!-- 비동기로 로깅용 스레드를 사용하고 메모리에 로그를 임시 보관하기 때문에 비정상 종료를 대비해야합니다. -->
<appender name="ASYNC_INFO" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>5000</queueSize>
<discardingThreshold>0</discardingThreshold>
<neverBlock>false</neverBlock>
<includeCallerData>false</includeCallerData>
<appender-ref ref="FILE_INFO"/>
</appender>
<appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>5000</queueSize>
<discardingThreshold>0</discardingThreshold>
<neverBlock>false</neverBlock>
<includeCallerData>true</includeCallerData>
<appender-ref ref="FILE_ERROR"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ASYNC_INFO"/>
<appender-ref ref="ASYNC_ERROR"/>
</root>
</configuration>
XML
복사
비동기 로깅에 대한 shutDownHook
@Component
class LogbackShutdownHook {
/**
* Logback Shutdown Hook
* Logback의 Shutdown Hook을 등록하여 애플리케이션 종료 시 Logback의 AsyncAppender 내부 큐를 flush하고 종료합니다.
*/
@PreDestroy
fun onDestroy() {
val context = LoggerFactory.getILoggerFactory() as LoggerContext
context.stop()
}
}
Java
복사