토이프로젝트/로그
[Log #2] LogBack을 이용한 로그 설정
거북이의 기술블로그
2025. 4. 7. 18:06
LogBack
- Spring Boot에서 로그를 다룰 때 가장 많이 쓰는 로깅 구현체는 Logback
- logback-spring.xml을 이용하면 로그 포맷, 출력 방식, 파일 보관 정책 등을 유연하게 설정 가능.
로그 출력 경로 제어
클래스 종류설명
ConsoleAppender | 콘솔에 출력 |
FileAppender | 고정된 파일에 저장 |
RollingFileAppender | 시간/용량 기준으로 파일 분리 저장 |
SMTPAppender | 메일 전송용 |
DBAppender | DB에 로그 저장용 |
로그 Level정의
OFF | 로그 기록 안 함 |
FATAL | 시스템 치명적 오류 |
ERROR | 예상하지 못한 오류 |
WARN | 경고, 주의 필요 |
INFO | 운영 중 참고용 메시지 |
DEBUG | 개발 중 디버깅 정보 |
TRACE | 가장 세세한 단계의 로그 |
로그 롤링 정책 (파일 관리)
> fileNamePattern: 저장될 파일명 패턴
> maxHistory: 보관할 최대 파일 개수
> maxFileSize: 파일 1개의 최대 용량
> totalSizeCap: 전체 로그 용량 제한 (초과 시 오래된 로그 삭제됨)
로그 패턴 정책
%d{yyyy-MM-dd HH:mm:ss.SSS} | 로그 발생 시점의 날짜와 시간을 포맷에 맞춰 출력 → 2025-04-07 15:32:12.451 |
%magenta(...) | 해당 내용(여기선 쓰레드)을 보라색으로 출력 (콘솔 색상 적용용) |
%thread | 로그를 출력한 스레드 이름 |
%highlight(...) | 로그 레벨에 따라 색상을 자동 적용 (ex INFO → 녹색, WARN → 노란색, ERROR → 빨간색 등) |
%level | 로그 레벨(INFO, WARN, ERROR 등)을 표시 |
%logger{5} | 로거 이름(클래스명 또는 패키지 경로)의 마지막 5개 단어만 표시 (ex com.example.controller.UserController → c.e.c.UserController) |
- | 구분자 (시각적 효과) |
%msg | 실제 로그 메시지 내용 |
%n | 줄바꿈 (platform-specific newline, \n 또는 \r\n 등) |
LogBack 설정 예시
[ 로그 저장 형식 지정 및 설정 ]
<!-- 콘솔 출력 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_PATTERN}</Pattern>
</encoder>
</appender>
<!-- 파일 출력 + 롤링 -->
<appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${ROLLING_PATTERN}</pattern>
</encoder>
<file>${FILE_NAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
</rollingPolicy>
</appender>
[ root 로거 설정 ]
<root level="INFO">
// 콘솔 출력 및 파일 출력
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</root>
[ 특정 패키지 로그 설정 ]
<logger name="com.example.application.paging" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
ex) JDBC 관련 로그 설정
<logger name="jdbc" level="OFF" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
전체 코드
( Console + File 로그 출력 XML )
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 로그 xml 파일 환경변수 사용 property -->
<property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight([%-3level]) %logger{5} - %msg %n" />
<property name="ROLLING_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{5} - %msg %n" />
<property name="FILE_NAME" value="C:/logs/application.log" />
<property name="LOG_NAME_PATTERN" value="./logs/application-%d{yyyy-MM-dd HH:mm:ss}.%i.log" /> <!-- 1초 기준 로그 저장-->
<property name="MAX_FILE_SIZE" value="10MB" />
<property name="TOTAL_SIZE" value="30MB" />
<property name="MAX_HISTORY" value="30" /> <!-- 보관 파일 개수 -->
<!-- ----------------------------------------------------------- -->
<!-- Console appender 설정 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_PATTERN}</Pattern>
</encoder>
</appender>
<!-- ----------------------------------------------------------- -->
<!-- Rolling File appender 설정 -->
<appender name="ROLLING_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${ROLLING_PATTERN}</pattern>
</encoder>
<file>${FILE_NAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_NAME_PATTERN}</fileNamePattern>
<maxHistory>${MAX_HISTORY}</maxHistory>
<maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
<totalSizeCap>${TOTAL_SIZE}</totalSizeCap>
</rollingPolicy>
</appender>
<!-- ----------------------------------------------------------- -->
<!-- SQL 쿼리 로그 기록 (level 및 로그 기록 여부 지정) -->
<!-- JDBC 관련 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc" level="OFF" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- SQL 로그 + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc.sqlonly" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- 쿼리 성능 측정 로그 OFF + 로거 전파 x (상위로그 출력 x) -->
<logger name="jdbc.sqltiming" level="OFF" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<logger name="org.hibernate.SQL" level="DEBUG" additive="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- ----------------------------------------------------------- -->
<!-- 패키지 하위 로그 기록 (level 지정// 각자 맞는 패키지명으로 변경 필요) -->
<logger name="com.example.application.fileInputOutput" level="INFO" additive="true" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<logger name="com.example.application.paging" level="DEBUG" additive="false" >
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</logger>
<!-- ----------------------------------------------------------- -->
<!-- 전역 로그 설정 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLING_LOG_FILE"/>
</root>
<!-- ----------------------------------------------------------- -->
</configuration>
로그파일 기록 현황
*참고 자료*
https://logback.qos.ch/manual/configuration.html
Chapter 3: Configuration
In symbols one observes an advantage in discovery which is greatest when they express the exact nature of a thing briefly and, as it were, picture it; then indeed the labor of thought is wonderfully diminished. —GOTTFRIED WILHELM LEIBNIZ Chapter 3: Logba
logback.qos.ch
https://logging.apache.org/log4j/2.x/manual/configuration.html
Configuration file :: Apache Log4j
Starting with Log4j 2, the configuration file syntax has been considered part of the public API and has remained stable across significant version upgrades. The syntax of the configuration file changed between Log4j 1 and Log4j 2. Files in the Log4j 1 s
logging.apache.org