본문 바로가기

개발기술/빌드, 배포, 운영

로그

로그 레벨 기준

레벨 운영 로그에 포함 의미 및 사용 기준
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 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로 모두 전달됩니다.
<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