로그 레벨 기준
레벨 | 운영 로그에 포함 | 의미 및 사용 기준 |
ERROR | ✅ 필수 | 예외 및 치명적인 오류 상황 (사용자 영향 有) |
WARN | ✅ 권장 | 예상하지 못한 상태이지만 무시하고 넘어갈 수 있는 경우 |
INFO | ✅ 제한적 사용 | 주요 비즈니스 흐름 (ex: 유저 로그인, 주문 완료 등) |
DEBUG | ❌ 기본 제외 | 디버깅용 상세 정보, 개발 환경 전용 |
TRACE | ❌ 제외 | 매우 상세한 흐름 추적, 거의 사용 안 함 |
운영환경 로그 전략
- ERROR, WARN은 무조건 포함
- INFO는 중요한 비즈니스 흐름만 찍음
- DEBUG는 절대 포함하지 않음 (오류 재현 시 임시로만 허용)
- Profile(prod, dev)에 따라 구분해서 관리
운영 로그에 INFO가 포함될 수 있는 경우
- 사용자 액션이 중요한 흐름을 만들 때 (예: 결제, 로그인, 배치 완료)
- 시스템 상태 변화가 있는 경우 (예: 서비스 시작, 외부 API 호출 성공)
로그백
Java 로 작성된 로깅 프레임워크이며, SLF4J의 대표 구현체입니다. 설정파일은 보통 classpath 루트에 logback.xml 또는 logback-spring.xml로 존재
logback.xml은 Spring Context 초기화보다 먼저 로드되므로 application.yml이나 .properties에서 HOME_DIR을 정의해도 반영되지 않음
- logback-classic, logback-core 두 모듈로 구성됨
- SLF4J의 구현체, 실제 로그 출력은 Logback이 처리하고, SLF4J는 그 위에 추상화 계층일 뿐입니다.
- Spring Boot에서 기본으로 사용하는 로깅 시스템
실행 구조
- 애플리케이션이 시작되면,
- LoggerFactory.getLogger() 호출
- Logback의 LoggerContext가 초기화되며,
- logback.xml을 읽어서 Appender, Encoder 등을 설정
- 로그가 발생하면, 해당 로그가 설정된 Appender에 따라 Console, File 등에 출력됨
logback.xml 구성요소
Logback이 동작하는 방식과 출력 형식 등을 설정하기 위한 설정파일입니다.
핵심구성요소의 역할
- <appender>: 어디에 로그를 남길지 (Console, File 등)
- <encoder>: 로그 출력 형식
- <root>: 전체 로그레벨과 기본 출력 대상
- <configuration> : Logback 설정의 루트 엘리먼트입니다. 모든 로깅 설정은 이 태그 내부에서 이루어집니다.
- <variable> : 변수 선언입니다. 이 설정에서는 HOME_DIR 환경 변수 값을 LOG_DIR로 매핑하고 있습니다.
- 여기 예시에서 변수 HOME_DIR은 JVM의 변수로 java를 실행시킬때 주입해야함
- encoder란? 로그백에서 로그 메시지의 출력 형식(포맷)을 정의하는 구성 요소입니다.
- 대부분 PatternLayoutEncoder를 사용해서 패턴 문자열로 로그 형식을 지정합니다
- 아래 패턴 옵션들은 Logback에 특화된 것들
주요패턴옵션 | 설명 |
%d{패턴} | 날짜/시간 출력 (yyyy-MM-dd HH:mm:ss.SSS) |
%thread | 로그를 기록한 스레드 이름 |
%level | 로그 레벨 (INFO, ERROR 등) |
%-5level | 로그 레벨을 왼쪽 정렬로 5칸 확보해서 출력 |
%logger{36} | 클래스 경로 (숫자는 자릿수 제한) |
%highlight(표현식) | 표현식으로 안에 들어간 내용 전체를 로그레벨 기준으로 색을 달리 출력 |
%boldMagenta(표현식) | 괄호 안 전체를 진한 보라색으로 출력합니다. |
%msg | 로그 메시지 내용 |
%n | 줄바꿈 (newline) |
%M | 메서드 이름 (Method name) |
%L | 로그를 호출한 라인 번호 |
%C{1} | C는 클래스의 전체 경로를 뜻함, {1}은 마지막 클래스 이름 한 개만 출력하겠다는 뜻 |
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%highlight(%-5level)] [%boldMagenta(%C{1}.%M)][%L] - %msg%n</pattern>
</encoder>
- Appender란? : 로그를 "출력"하는 대상(콘솔, 파일, DB, 원격 서버 등)을 설정하는 객체
주요 Appender 종류 | 클래스설명 |
ConsoleAppender | 콘솔 (stdout)에 로그 출력 |
FileAppender | 지정한 파일에 로그 출력 |
RollingFileAppender | 일정 용량/날짜 기준으로 로그 파일 분할 저장 |
AsyncAppender | 비동기 로깅 (성능 향상용) |
SocketAppender | 원격 서버로 로그 전송 |
<variable name="LOG_DIR" value="${HOME_DIR}" />
<variable name="FILE_NAME" value="admin.log" />
- STDOUT Appender : 로그를 콘솔 (표준 출력) 으로 출력하는 appender입니다.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- FILE Appender : 로그를 파일로 저장하는 appender입니다.
- rollingPolicy : 시간 기반 롤링 정책 사용. 매일 로그를 압축(zip)하여 백업
- 하루 지난 로그는 admin.log.YYYY-MM-DD.zip 으로 보관
- maxHistory=1 → 하루치만 보관 (이전 날짜 로그 삭제됨)
- cleanHistoryOnStart=true → 서버 시작 시 오래된 로그 자동 삭제
- rollingPolicy : 시간 기반 롤링 정책 사용. 매일 로그를 압축(zip)하여 백업
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${FILE_NAME}.%d{yyyy-MM-dd}.zip</fileNamePattern>
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- root : Logback 설정에서 로그 레벨과 출력 대상을 전체 애플리케이션에 기본 적용하는 **루트 로거(root logger)**입니다. 모든 로거의 최상위 부모라고 생각하면 됩니다.
- 전체 시스템에서 기본 적용되는 로그 수준(Level)을 정의하고 기본 출력 대상(Appender)을 지정
- 주요속성 level : 루트 로거의 최소 로그 레벨을 설정합니다.
- 하위 태그 <appender-ref> : 위에서 정의한 Appender를 참조하여 출력 대상 지정 (ref="STDOUT")
- 아래예시 : DEBUG 이상인 모든 로그 (DEBUG, INFO, WARN, ERROR)가 출력됩니다. STDOUT, FILE appender로 모두 전달됩니다.
- 전체 시스템에서 기본 적용되는 로그 수준(Level)을 정의하고 기본 출력 대상(Appender)을 지정
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 변수 지정 -->
<variable name="LOG_DIR" value="${HOME_DIR}" />
<variable name="FILE_NAME" value="admin.log" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%highlight(%-5level)] [%boldMagenta(%C{1}.%M)][%L] - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/${FILE_NAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${FILE_NAME}.%d{yyyy-MM-dd}.zip</fileNamePattern>
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%highlight(%-5level)] [%boldMagenta(%C{1}.%M)][%L] - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
'개발기술 > 빌드, 배포, 운영' 카테고리의 다른 글
쉘 커맨드 , 쉘 스크립트 (0) | 2025.03.25 |
---|---|
원격제어 (0) | 2025.03.13 |
Jenkins CI/CD 자동화 (0) | 2025.01.26 |
빌드와 Gradle 개념, Gradle 빌드 사용법 (0) | 2024.11.12 |
빌드 후 서버 배포 (0) | 2024.11.12 |