빙응의 공부 블로그
[+/KM]Logback으로 EC2 환경 로그 관리하기 본문

📝배경
이번 게시글에서는 Spring Boot에서 Logback을 활용해 EC2 서버에서 로그를 환경별로 효율적으로 관리하는 방법에 대해 설명합니다.
특히, 운영 환경에서 로그 가독성 문제를 어떻게 해결했는지 실제 프로젝트 기반 경험을 바탕으로 공유드리려 합니다.
로컬 환경에서는 테스트 진행 시에 로그를 바로바로 확인이 가능해서 문제점이 드러나지 않았지만,
EC2에 서버를 배포하면서 로그를 직접 EC2 서버를 연결하여 확인해야했습니다. EC2 서버의 로그는 가독성이 떨어졌고, 이를 반드시 개선해야겠다고 생각했습니다. 로컬 환경에서는 콘솔만 쳐다보면 되지만, EC2 서버에 배포된 뒤에는 SSH로 직접 접속해 로그를 뒤져야 하는 불편함이 있었습니다. 특히 로그가 단일 파일에 뒤섞여 있어 필요한 정보를 찾는 데만 몇 분씩 소요되었고, 운영 중 장애가 발생하면 대응 속도가 떨어지는 것이 가장 큰 문제였습니다.
아래 사진처럼 가독성이 매우 안좋습니다..

📝Logback
이러한 문제를 해결하기 위해 저는 Logback을 사용할 것입니다.
✅Logback은 무엇인가요?
Logback은 SLF4J(Simple Logging Facade for Java)를 구현한 로깅 프레임워크로, log4j의 뒤를 잇는 프레임워크다.
✅Logback을 굳이 사용하는 이유는?
가장 큰 이유는 Spring Boot의 기본 로깅 구현체라는 점입니다. 따라서 Spring Boot 프로젝트에 별도의 설정 없이 쉽게 적용할 수 있습니다. 또한 다음과 같은 장점들이 있습니다.
- SLF4J와의 완벽한 호환성: SLF4J를 통해 추상화된 로깅 API를 사용함으로써 특정 로깅 프레임워크에 종속되지 않고 유연하게 전환할 수 있습니다.
- 풍부한 문서와 예시: 잘 정리된 공식 문서와 다양한 사용 예시를 통해 학습 및 적용이 용이합니다.
- 유연한 설정: XML, Groovy 등 다양한 형식으로 설정 파일을 작성할 수 있으며,
✅ Logback 설정 파일: logback-spring.xml
Logback의 설정은 주로 logback-spring.xml 파일을 통해 이루어집니다. 이 파일은 Spring 환경에서 Logback을 더욱 유연하게 사용할 수 있도록 springProfile과 같은 Spring Boot 전용 확장 요소를 지원합니다.
<configuration scan="true">
<!-- -------------------------------------------------------------- -->
<!-- 1. 공통 변수 설정 -->
<!-- -------------------------------------------------------------- -->
<property name="LOG_DIR" value="logs"/>
<property name="FILE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] [%thread] %-5level [%C.%M:%L] - %msg %ex{5}%n"/>
<property name="CONSOLE_LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg %ex{5}%n"/>
<!-- -------------------------------------------------------------- -->
<!-- 2. local 프로파일: 로컬 개발 시 콘솔만 출력 -->
<!-- -------------------------------------------------------------- -->
<springProfile name="local">
<include resource="logs/console-appender.xml"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- -------------------------------------------------------------- -->
<!-- 3. dev 프로파일: 개발 테스트 환경에서 진행하는 로그 -->
<!-- -------------------------------------------------------------- -->
<springProfile name="dev">
<include resource="logs/common/file-info-appender.xml"/>
<include resource="logs/common/file-warn-appender.xml"/>
<include resource="logs/common/file-error-appender.xml"/>
<include resource="logs/error/file-info-appender.xml"/>
<include resource="logs/error/file-warn-appender.xml"/>
<include resource="logs/error/file-error-appender.xml"/>
<logger additivity="false" level="INFO" name="ErrorLogger">
<appender-ref ref="ERROR_ERROR"/>
<appender-ref ref="ERROR_WARN"/>
<appender-ref ref="ERROR_INFO"/>
</logger>
<root level="INFO">
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-WARN"/>
<appender-ref ref="FILE-ERROR"/>
</root>
</springProfile>
<!-- -------------------------------------------------------------- -->
<!-- 4. prod 프로파일: 운영 환경에서 파일별 + 에러전용 분리 -->
<!-- -------------------------------------------------------------- -->
<springProfile name="prod">
<!-- 공통 로그(INFO/WARN/ERROR) -->
<include resource="logs/common/file-info-appender.xml"/>
<include resource="logs/common/file-warn-appender.xml"/>
<include resource="logs/common/file-error-appender.xml"/>
<!-- 에러 전용 로그 분리 -->
<include resource="logs/error/file-info-appender.xml"/>
<include resource="logs/error/file-warn-appender.xml"/>
<include resource="logs/error/file-error-appender.xml"/>
<!-- ErrorLogger: 에러 레벨 로깅 전용 (중복 기록 방지) -->
<logger name="ErrorLogger" level="ERROR" additivity="false">
<appender-ref ref="ERROR_ERROR"/>
<appender-ref ref="ERROR_WARN"/>
<appender-ref ref="ERROR_INFO"/>
</logger>
<!-- Root Logger: INFO 이상 로그는 모두 파일에 기록 -->
<root level="INFO">
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-WARN"/>
<appender-ref ref="FILE-ERROR"/>
</root>
</springProfile>
</configuration>
✅Logback 설정 파일의 주요 요소
- <configuration>: Logback 설정의 시작점입니다. scan="true" 속성을 지정하면 설정 파일의 변경을 감지하여 애플리케이션 재시작 없이 자동으로 재로드합니다. 이는 개발 및 운영 환경에서 유연한 로그 관리를 가능하게 합니다.
- <property>: 재사용 가능한 변수(프로퍼티)를 정의합니다. 위 설정에서는 로그 파일이 저장될 디렉토리(LOG_DIR)와 콘솔 및 파일 로그의 출력 패턴(FILE_LOG_PATTERN, CONSOLE_LOG_PATTERN)을 정의하여 가독성을 높였습니다.
- <appender>: 로그를 "어디에, 어떻게" 보낼지 결정하는 장치입니다. 로그를 콘솔에 출력하거나, 파일에 저장하거나, 원격 서버로 전송하는 등 다양한 방법을 지원합니다. 대표적으로 ConsoleAppender(콘솔 출력), RollingFileAppender(로그 파일을 일정 기준에 따라 롤링하며 저장) 등이 있습니다. 별도의 XML 파일로 분리하여 include로 참조하면 설정의 재사용성을 높일 수 있습니다.
- <springProfile>: Spring Boot 전용 확장 요소로, 특정 프로파일(active profile)에만 포함될 설정 블록을 감싸줍니다. name 속성에 local, dev, prod 등 프로파일 이름을 나열하여 환경별로 다른 로그 설정을 적용할 수 있습니다. 이는 개발, 테스트, 운영 환경에 맞는 유연한 로그 전략을 구현하는 데 핵심적인 역할을 합니다.
- <logger>: 특정 패키지 또는 클래스 단위로 로깅 레벨과 Appender를 별도로 지정할 때 사용합니다. 예를 들어, 특정 패키지의 로그만 DEBUG 레벨로 자세히 보거나, 에러 로그만 별도의 파일로 분리하여 관리할 수 있습니다. additivity="false"를 설정하면 해당 로거에 연결된 Appender로만 로그가 전달되고, 상위 로거(Root Logger 포함)에는 전달되지 않아 로그 중복 기록을 방지할 수 있습니다.
- <root>: 애플리케이션 전체에 적용되는 기본 로거입니다. 이곳에 연결된 Appender는 별도로 다른 Logger가 지정되지 않은 모든 로그에 적용됩니다. level 속성으로 기본 로깅 레벨을 설정합니다
📝Logback Profile 별 설정
이제 위 logback-spring.xml 파일의 각 프로파일 설정에 대해 자세히 알아보겠습니다.
1. local 프로파일: 로컬 개발 시 콘솔만 출력
local 프로파일은 개발자가 로컬 환경에서 테스트할 때 사용합니다. 이 프로파일에서는 콘솔 출력만을 기본으로 설정하여 개발의 편의성을 높입니다.
<springProfile name="local">
<include resource="logs/console-appender.xml"/> <root level="INFO">
<appender-ref ref="CONSOLE"/> </root>
</springProfile>
2. dev 프로파일: 개발 테스트 환경에서 파일로 분리된 로그 기록
dev 프로파일은 개발 서버나 테스트 환경에서 사용됩니다. 이 환경에서는 로그를 콘솔뿐만 아니라 파일로도 기록하여 보관하고 분석할 수 있도록 합니다. 특히, 로그를 레벨별(INFO, WARN, ERROR)로 분리하고, 에러 로그는 별도의 로거로 관리하여 효율적인 모니터링을 가능하게 합니다.
<springProfile name="dev">
<include resource="logs/common/file-info-appender.xml"/>
<include resource="logs/common/file-warn-appender.xml"/>
<include resource="logs/common/file-error-appender.xml"/>
<include resource="logs/error/file-info-appender.xml"/>
<include resource="logs/error/file-warn-appender.xml"/>
<include resource="logs/error/file-error-appender.xml"/>
<logger additivity="false" level="INFO" name="ErrorLogger">
<appender-ref ref="ERROR_ERROR"/>
<appender-ref ref="ERROR_WARN"/>
<appender-ref ref="ERROR_INFO"/>
</logger>
<root level="INFO">
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-WARN"/>
<appender-ref ref="FILE-ERROR"/>
</root>
</springProfile>
3. prod 프로파일: 운영 환경에서 파일별 + 에러 전용 분리
prod 프로파일은 실제 서비스가 운영되는 환경에서 사용됩니다. dev 프로파일과 유사하게 로그를 파일로 기록하지만, 운영 환경의 특성을 고려하여 에러 로그를 더욱 명확하게 분리하고 관리하는 데 중점을 둡니다.
<springProfile name="prod">
<include resource="logs/common/file-info-appender.xml"/>
<include resource="logs/common/file-warn-appender.xml"/>
<include resource="logs/common/file-error-appender.xml"/>
<include resource="logs/error/file-info-appender.xml"/>
<include resource="logs/error/file-warn-appender.xml"/>
<include resource="logs/error/file-error-appender.xml"/>
<logger name="ErrorLogger" level="ERROR" additivity="false">
<appender-ref ref="ERROR_ERROR"/>
<appender-ref ref="ERROR_WARN"/>
<appender-ref ref="ERROR_INFO"/>
</logger>
<root level="INFO">
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="FILE-WARN"/>
<appender-ref ref="FILE-ERROR"/>
</root>
</springProfile>
prod 프로파일의 설정은 dev 프로파일과 거의 동일하게 보이지만, 운영 환경의 중요성을 감안하여 에러 로그 분리 및 중복 방지에 더욱 신경 썼습니다. 특히 ErrorLogger의 level="ERROR" 설정은 해당 로거가 오직 ERROR 레벨의 로그만 처리하도록 하여, 운영 환경에서 중요한 에러를 더욱 집중적으로 관리할 수 있게 합니다.
📌 Docker 환경에서의 Logback 로그 관리 주의점: Volume 마운트
EC2 서버에서 Logback을 통해 생성되는 로그 파일들을 효과적으로 관리하려면, Docker 컨테이너의 로그 디렉토리를 호스트 EC2 인스턴스의 볼륨에 마운트해야 합니다. 이 과정을 생략하면 컨테이너가 삭제될 때 로그 파일도 함께 사라지거나, 컨테이너 내부에 고립되어 외부에서 접근하기 어려워집니다.
이를 위해 docker-compose.yml 파일에 다음과 같은 volumes 설정을 추가해야 합니다.
volumes:
- /home/ubuntu/logs/logging:/logs/logging
📝결론
Logback을 활용하여 EC2 환경에서 로그를 관리하는 것은 가독성 향상뿐만 아니라 효율적인 문제 해결에도 큰 도움이 됩니다. logback-spring.xml 파일을 통해 프로파일별로 로그 설정을 분리함으로써 개발, 테스트, 운영 환경에 최적화된 로깅 전략을 구축할 수 있습니다. 특히 에러 로그를 별도로 분리하고 관리하는 것은 운영 중 발생할 수 있는 장애에 신속하게 대응하는 데 필수적입니다
다음 포스팅에서는 EC2 환경에서 Logback을 통해 로그를 효과적으로 수집하고 관리하는 단계를 넘어서, 모니터링 도구를 활용하여 로그를 시각화하고, 분석하며, 실시간으로 알림을 받는 것을 목표로 하겠습니다.
'Project > PlusKM' 카테고리의 다른 글
| [+/KM] AWS EC2에서 Loki, Promtail로 실시간 로그 시각화하기 (0) | 2025.06.17 |
|---|---|
| [+/KM] AWS EC2에서 Prometheus와 Grafana로 실시간 시스템 상태 시각화하기 (2) | 2025.06.15 |
| [+/KM]AWS OutOfMemoryError 극복: active 컬럼 기반 공공데이터 갱신 배치 전략 (2) | 2025.06.11 |
| [+/KM]JDBC Batch로 CSV 데이터 저장 최적화 (0) | 2025.02.18 |
| [+/KM]공간 데이터 데이터베이스 최적화를 위한 MongoDB 도입 (0) | 2025.01.22 |