[Spring Boot] logback-spring.xml 정리

[Spring Boot] logback-spring.xml 정리

Last Updated: 2025년 07월 06일

로그 내용을 logs/error, logs/info, logs/warn 구분을 해서 날짜별로 저장을 하며, 로그 내용을 일관성있게 잘 정리를 해야 나중에 로그를 분석해서 API 통계, 에러 내용등을 뽑아낼수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

	<timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
	<property name="LOGS_DIR_ROOT_PATH" value="logs"/>
	<property name="LOGS_BACKUP_DIR_ROOT_PATH" value="logs-backup"/>
	<!-- 날짜, 시간, 로그 레벨, 스레드 이름, 로거 이름, 메시지 형식 -->
	<!--<property name="CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss,Asia/Seoul}:%-4relative] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg%n"/>-->
	<property name="CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss,Asia/Seoul}] %green([%thread]) %highlight(%-5level) %boldWhite([%M:%yellow(%L)]) - %msg%n"/>
	<property name="FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss,Asia/Seoul}:%-4relative] [%thread] %-5level [%C.%M:%L] - %msg%n"/>

	<!-- 실제 운영시 local 삭제 -->
	<springProfile name="prod, local">
		<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
			<file>${LOGS_DIR_ROOT_PATH}/info/info-${BY_DATE}.log</file>
			<filter class = "ch.qos.logback.classic.filter.LevelFilter">
				<level>INFO</level>
				<onMatch>ACCEPT</onMatch>
				<onMismatch>DENY</onMismatch>
			</filter>
			<encoder>
				<pattern>${FILE_LOG_PATTERN}</pattern>
				<immediateFlush>true</immediateFlush>
			</encoder>
			<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
				<fileNamePattern>${LOGS_BACKUP_DIR_ROOT_PATH}/info/info-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
				<maxFileSize>10MB</maxFileSize>
				<maxHistory>10</maxHistory>
				<totalSizeCap>100MB</totalSizeCap>
			</rollingPolicy>
		</appender>

		<appender name="FILE-WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
			<file>${LOGS_DIR_ROOT_PATH}/warn/warn-${BY_DATE}.log</file>
			<filter class = "ch.qos.logback.classic.filter.LevelFilter">
				<level>WARN</level>
				<onMatch>ACCEPT</onMatch>
				<onMismatch>DENY</onMismatch>
			</filter>
			<encoder>
				<pattern>${FILE_LOG_PATTERN}</pattern>
				<immediateFlush>true</immediateFlush>
			</encoder>
			<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
				<fileNamePattern>${LOGS_BACKUP_DIR_ROOT_PATH}/warn/warn-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
				<maxFileSize>10MB</maxFileSize>
				<maxHistory>30</maxHistory>
				<totalSizeCap>100MB</totalSizeCap>
			</rollingPolicy>
		</appender>

		<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
			<file>${LOGS_DIR_ROOT_PATH}/error/error-${BY_DATE}.log</file>
			<filter class = "ch.qos.logback.classic.filter.LevelFilter">
				<level>ERROR</level>
				<onMatch>ACCEPT</onMatch>
				<onMismatch>DENY</onMismatch>
			</filter>
			<encoder>
				<pattern>${FILE_LOG_PATTERN}</pattern>
				<immediateFlush>true</immediateFlush>
			</encoder>
			<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
				<fileNamePattern>${LOGS_BACKUP_DIR_ROOT_PATH}/error/error-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
				<maxFileSize>10MB</maxFileSize>
				<maxHistory>30</maxHistory>
				<totalSizeCap>100MB</totalSizeCap>
			</rollingPolicy>
		</appender>

		<root level="INFO">
			<appender-ref ref="FILE-INFO"/>
			<appender-ref ref="FILE-WARN"/>
			<appender-ref ref="FILE-ERROR"/>
		</root>
	</springProfile>

	<springProfile name="default, local">
		<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
			<encoder>
				<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			</encoder>
		</appender>

		<root level="INFO">
			<appender-ref ref="CONSOLE"/>
		</root>
	</springProfile>

</configuration>

You may also like