SlideShare a Scribd company logo
1 of 65
주니어 개발자의
서버 로그 관리 개선기
Incheon/Songdo
How to Improve Server Log Management
as a Junior Developer
김연희 Yeonhee Kim
- 스몰티켓 백엔드 개발자
- Girls in Tech Korea 운영진
- freeCodeCamp 한국어 번역 자원봉사자
오늘 발표에서 다룰 내용
- 로깅, 중앙 집중식 로깅, 로그 회전 개념 및 적용
- Java, Spring Boot에서의 실제 적용 중심
- PLG(Promtail, Loki, Grafana)를 통한 로그 중앙화
- Deep한 데이터 엔지니어링은 다루지 않습니다!
Let’s start :)
로그(Log)
애플리케이션, 네트워크 또는 서버에서 발생하는
모든 일에 대한 기록
로그의 중요성
- 사용자 문의 대응
- 에러 추적: 재현하기 힘든 버그에 대한 유용한 정보 제공
- 성능에 관한 통계와 정보 제공
- 데이터 지표 추출
- 법적 근거
기존 사내
로그 관리 시스템
AS-IS
Incheon/Songdo
로그 필터링의 어려움
- 특정 로그의 중요도에 대한 기준 부재
- 중요하거나 필요한 로그만 따로 모아서 보기 어려움
로그 추적의 어려움
- 직접 서버 인스턴스별 터미널에 접속해야 함
- 멀티스레드 및 분산 환경에서 로그를 모아서 보기 어려움
방대한 로그 파일 용량
- 상용 서버 기준 인스턴스 하나당 하루 평균 600~700MB
크기의 애플리케이션 로그 파일이 적재되고 있음
- 로그 파일로 인해 스토리지 용량이 금방 차버림
로그를 어떻게 관리하면 좋을지
공부해서 개선해보자!
로깅 Logging
Incheon/Songdo
로깅 (Logging)
- 시스템이나 프로그램에서 발생하는 중요한 이벤트나 정보를
기록함 = 로그(Log)를 생성함
로그 출력 방식
- 직접 출력하는 방식
- 로깅 라이브러리를 이용하는 방식
로깅 라이브러리를 사용하자!
- 로그 메세지를 포함해서 다양한 상세 정보를 담을 수 있음
- (async 설정시) 성능도 로깅 라이브러리가 더 좋음!
Java의 표준 로깅 라이브러리
Log4j Logback Log4j2
Slf4j
Simple Logging Facade For Java
Appender
- 로그의 출력 위치와 형태를 설정하는 영역
Appender
- ConsoleAppender : 콘솔에 로그 출력
- FileAppender : 로그를 파일로 저장
- RollingFileAppender : 로그를 여러 개의 파일로 저장
- DBAppender : DB에 로그를 저장
- SMTPAppender : 메일로 로그를 보냄
Filter
- 특정 로그 레벨만 필터링하여 적용
Log Level
ERROR 애플리케이션에서 발생한 심각한 에러나 예외
WARN 잠재적으로 문제가 될 수 있는 경우
INFO 시스템에 대한 정보 제공(표준 로그 레벨)
DEBUG 개발 또는 테스트 단계에서 디버깅
TRACE DEBUG 레벨보다 더 디테일한 메세지
Encoder
- Pattern을 사용해서 원하는 형식으로 로그 출력
Timestamp
ISO8601
(표준 날짜 및 시간 형식)으로 기록
스레드 이름 로그 레벨 로거 이름 로그 메세지
MDC
- Mapped Diagnostic Contexts
- 현재 실행중인 스레드에 메타 정보를 넣고 관리할 수 있는
공간
- Map (Key, Value) 형태이므로 관리 용이
Client A
Client B
Thread A
Thread B
Server
멀티스레드 환경에서 로그가 뒤섞여서 요청별 흐름 파악이 어려움
MDC에 Trace ID 넣기
MDC에 Trace ID 넣기
- 코드를 어디에서 작성할까?
Dispatcher
Servlet
Interceptor AOP Controller
Filter
Web Container
Spring Context
Encoder에 Trace ID 표기하기
Root & Logger
- 설정한 Appender를 참조해서 로그 레벨 설정
전역 설정
지역 설정
로그 메세지 작성시 유의점
- e.printStackTrace()를 쓰지 말자
- 내부적으로 System.err.println() 사용함
로그 메세지 작성시 유의점
- 에러 메세지를 분명하게 나타내자
로그 메세지 작성시 유의점
- 문자열 연산을 하지 말고 치환문자 {}를 사용하자
- 성능과 가독성 모두 좋아짐
로그 메세지 작성시 유의점
- 로그에 개인정보(사용자의 전화번호, 주소, 계좌번호,
비밀번호 등) 남기지 않기
- 로그 기록 전에 마스킹이나 암호화 처리하기
개선 #1 - 중요도에 따른 로깅
- 로그 레벨별로 모아보기
- 디버깅용 System.out.println() → log.debug()
- e.printStackTrace() → log.error()로 대체
- 로그 중요도 재조정
- 과도한 log.error() → log.warn()으로 하향
- 디버깅 관련 log.info() → log.debug()
개선 #1 - 중요도에 따른 로깅
- 중요도에 따른 로그 파일 분리
- 전체 로그 파일
- ERROR 및 WARN 파일
- HTTP 요청/응답 파일
개선 #2 - 멀티스레드 환경에서 로그 조회
- Filter를 통해 MDC에 Trace ID를 넣기
- 이후 Trace ID를 통해 특정 요청의 흐름 추적 가능
중앙 집중식 로깅
Centralized Logging
Incheon/Songdo
중앙 집중식 로깅
- 여러 시스템이나 장치에서 발생하는 로그 데이터를 하나의
위치에 모아 수집, 저장 및 관리하는 방식
Dashboard
Storage
Log Agent
Log Agent
중앙 집중식 로깅의 필요성
- Zero-Downtime Deployment
Load Balancer Instance A
Instance B
Client
중앙 집중식 로깅의 필요성
- MSA (Microservice Architecture)
Monolithic Microservices
중앙 집중식 로깅 솔루션
- Amazon CloudWatch
- AWS EC2와 연계가 쉽지만 요금이 들어감 💸
- ELK (Elasticsearch + Logstash + Kibana)
- 강력한 검색 및 쿼리 기능을 제공하고 엔터프라이즈급에 적합
- 무겁고 러닝 커브와 구축 및 운영 리소스가 있음
- PLG (Promtail + Loki + Grafana)
- 비교적 가볍고 설정이 어렵지 않으며 요구되는 리소스가 적음
- 대규모 데이터 처리에는 ELK보다 부족하며 레퍼런스가 비교적 적음
https://techblog.woowahan.com/14505/
PLG Stack
- Promtail : 로그 수집
- Loki : 로그 저장
- Grafana : 로그 시각화(대시보드)
Loki의 Indexing
- 로그의 메타데이터만 인덱싱, 원본 로그 메세지는 인덱싱 ❌
- 자원의 소모가 적어 효율적인 운영 가능
Write Path
Read Path
개선 #3 - 분산 환경에서 로그 조회
- Grafana의 대시보드에서 로그 모아보기
- 분산 환경 로그 모아보기
- 전체 로그, WARN / ERROR 로그, HTTP 요청 / 응답 로그
개선 #4 - 분산 환경에서 로그 검색
- Promtail을 통해 주요 label 지정
개선 #4 - 분산 환경에서 로그 검색
- LogQL을 통한 검색
- LogQL : Grafana Loki의 쿼리 언어
로그 회전
Log Rotation
Incheon/Songdo
로그 회전 (Log Rotation)
- 너무 오래되었거나 너무 큰 로그 파일을 분할, 압축, 이동
(아카이브) 또는 삭제하는 자동화된 프로세스
로그 회전 전략
- 시간 기반 회전: 일정한 시간 간격에 따른 회전
- 크기 기반 회전: 고정된 크기 제한에 따른 회전
- 하이브리드 회전: 시간과 크기 중 먼저 달성되는 것에 따른
회전
- 압축: 회전 후 로그 파일 압축
- 삭제: 일정 기간이 지나거나 특정 파일 수에 도달했을 때
오래된 로그 파일 삭제
Logrotate
- 리눅스 시스템에서 로그 파일을 관리하기 위한 유틸리티
- 대부분의 리눅스 배포판에 보통 기본적으로 설치되어 있음
Logback의 RollingFileAppender
- RollingPolicy
- SizeAndTimeBasedRollingPolicy : 하이브리드(시간+크기 기반) 회전
개선 #5 - 로그 회전 적용
- 로컬: ConsoleAppender로 콘솔에만 출력. 로그 파일 생성 ❌
- 개발 & 상용
- RollingFileAppender의 TimeBasedRollingPolicy 적용
- 개발은 30일 이전, 상용은 60일 이전 로그 파일 삭제 처리
- 파일명 : %d{yyyy-MM, aux}/%d-%i.log (2023-12/2023-12-10-0.log)
- SizeAndTimeBasedFNATP로 일자별, 크기별(256MB)로 로그 파일
분할
개선 #6 - 로그 아카이브
- Loki 설정을 통해 Index, Chunks를 S3에 저장
Index
Chunks
개선 #6 - 로그 아카이브
- 압축 파일을 AWS CLI를 통해 AWS S3로 전송 (상용에서만)
- 해당되는 셸 스크립트 작성
- 어제 날짜 로그 파일 압축 처리 (압축 파일명에 인스턴스 ID 추가)
- AWS CLI로 AWS S3로 압축 파일 전송
개선 #6 - 로그 아카이브
- Crontab을 통해 셸 스크립트를 주기적으로 실행
- 매일 오전 0시 10분에 AWS S3에 로그 압축 파일
업로드
개선 #7 - 보관 기간이 경과한 로그 삭제
- S3에서 주기적으로 파일이 자동 삭제되도록 규칙 생성
- 로그 보관 관련 법령과 회사 정책 참고 (ex: 5년 경과시 완전 삭제)
Summary
- 로그 필터링의 어려움
- 로그 레벨별로 중요도에 따른 로깅
- 중요도에 따른 로그 파일 분리
- 로그 추적의 어려움
- MDC를 이용한 Request 로깅
- PLG(Promtail, Loki, Grafana)를 통한 중앙 집중식 로깅
- 방대한 로그 파일 용량
- Logback에서 RollingFileAppender로 로그 회전 적용
- Crontab + AWS CLI를 통해 로그 압축 파일을 AWS S3로 전송 및 보관
Conclusion
- 절대적인 Best Solution은 없다!
- 회사 상황, 재정, 개발팀 규모, 기술 숙련도 등에 따라
달라질 수 있음
향후 과제
- OpenTelemetry, Tempo를 활용한 MSA 환경 트레이싱
- Grafana에 Prometheus를 연동해서 Metric 시각화
- 실제 서비스 운영과 모니터링을 통한 지속적인 개선
- 데이터 분석과 연관된 유의미한 로그 추가해보기
Thank you!
https://www.linkedin.com/in/yeonhee-hayden-kim/

More Related Content

What's hot

How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리YoungHeon (Roy) Kim
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법Jeongsang Baek
 
The Patterns of Distributed Logging and Containers
The Patterns of Distributed Logging and ContainersThe Patterns of Distributed Logging and Containers
The Patterns of Distributed Logging and ContainersSATOSHI TAGOMORI
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)fisuda
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교Woo Yeong Choi
 
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...Amazon Web Services Korea
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용흥배 최
 
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...Amazon Web Services Korea
 
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드문기 박
 
Aws glue를 통한 손쉬운 데이터 전처리 작업하기
Aws glue를 통한 손쉬운 데이터 전처리 작업하기Aws glue를 통한 손쉬운 데이터 전처리 작업하기
Aws glue를 통한 손쉬운 데이터 전처리 작업하기Amazon Web Services Korea
 
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017AWSKRUG - AWS한국사용자모임
 
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...Amazon Web Services Korea
 
Deep Dive and Best Practices for Real Time Streaming Applications
Deep Dive and Best Practices for Real Time Streaming ApplicationsDeep Dive and Best Practices for Real Time Streaming Applications
Deep Dive and Best Practices for Real Time Streaming ApplicationsAmazon Web Services
 
Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3SANG WON PARK
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정PgDay.Seoul
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안SANG WON PARK
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...문기 박
 
Azure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveAzure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveNaohiro Fujie
 
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Web Services Korea
 

What's hot (20)

How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
Airflow를 이용한 데이터 Workflow 관리
Airflow를 이용한  데이터 Workflow 관리Airflow를 이용한  데이터 Workflow 관리
Airflow를 이용한 데이터 Workflow 관리
 
로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법로그 기깔나게 잘 디자인하는 법
로그 기깔나게 잘 디자인하는 법
 
The Patterns of Distributed Logging and Containers
The Patterns of Distributed Logging and ContainersThe Patterns of Distributed Logging and Containers
The Patterns of Distributed Logging and Containers
 
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
FIWARE Orion Context Broker コンテキスト情報管理 (Orion 3.4.0対応)
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
 
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
데브시스터즈 데이터 레이크 구축 이야기 : Data Lake architecture case study (박주홍 데이터 분석 및 인프라 팀...
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...
대규모 온프레미스 하둡 마이그레이션을 위한 실행 전략과 최적화 방안 소개-유철민, AWS Data Architect / 박성열,AWS Pr...
 
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드
SQream-GPU가속 초거대 정형데이타 분석용 SQL DB-제품소개-박문기@메가존클라우드
 
Aws glue를 통한 손쉬운 데이터 전처리 작업하기
Aws glue를 통한 손쉬운 데이터 전처리 작업하기Aws glue를 통한 손쉬운 데이터 전처리 작업하기
Aws glue를 통한 손쉬운 데이터 전처리 작업하기
 
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017
AWS 기반 대규모 트래픽 견디기 - 장준엽 (구로디지털 모임) :: AWS Community Day 2017
 
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...
대용량 데이터레이크 마이그레이션 사례 공유 [카카오게임즈 - 레벨 200] - 조은희, 팀장, 카카오게임즈 ::: Games on AWS ...
 
Deep Dive and Best Practices for Real Time Streaming Applications
Deep Dive and Best Practices for Real Time Streaming ApplicationsDeep Dive and Best Practices for Real Time Streaming Applications
Deep Dive and Best Practices for Real Time Streaming Applications
 
Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3Apache kafka performance(latency)_benchmark_v0.3
Apache kafka performance(latency)_benchmark_v0.3
 
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
[pgday.Seoul 2022] 서비스개편시 PostgreSQL 도입기 - 진소린 & 김태정
 
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안
 
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
MSA(Service Mesh), MDA(Data Mesh), MIA(Inference Mesh) 기술동향 소개-박문기@메ᄀ...
 
Azure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep DiveAzure ADと外部アプリのID連携/SSO - Deep Dive
Azure ADと外部アプリのID連携/SSO - Deep Dive
 
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기Amazon Redshift로 데이터웨어하우스(DW) 구축하기
Amazon Redshift로 데이터웨어하우스(DW) 구축하기
 

Similar to 주니어 개발자의 서버 로그 관리 개선기

서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWSKRUG - AWS한국사용자모임
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020Jinwoong Kim
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴Terry Cho
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWSMatthew (정재화)
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4Seok-joon Yun
 
Pg day seoul 2016 session_02_v1.0_ff
Pg day seoul 2016 session_02_v1.0_ffPg day seoul 2016 session_02_v1.0_ff
Pg day seoul 2016 session_02_v1.0_ffPgDay.Seoul
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWSGruter
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oceuEngine Solutions
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
Accelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteAccelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteYEON BOK LEE
 
OPEN_POWER8_SESSION_20150316
OPEN_POWER8_SESSION_20150316OPEN_POWER8_SESSION_20150316
OPEN_POWER8_SESSION_20150316기한 김
 
Introduction to Apache Tajo
Introduction to Apache TajoIntroduction to Apache Tajo
Introduction to Apache TajoGruter
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영NAVER D2
 
Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0Kidong Lee
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AIJoongi Kim
 
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)SangIn Choung
 
마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기Jaewoo Ahn
 
Micro Service Architecture의 이해
Micro Service Architecture의 이해Micro Service Architecture의 이해
Micro Service Architecture의 이해Terry Cho
 

Similar to 주니어 개발자의 서버 로그 관리 개선기 (20)

서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020 AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
 
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
AWS기반 서버리스 데이터레이크 구축하기 - 김진웅 (SK C&C) :: AWS Community Day 2020
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
Pg day seoul 2016 session_02_v1.0_ff
Pg day seoul 2016 session_02_v1.0_ffPg day seoul 2016 session_02_v1.0_ff
Pg day seoul 2016 session_02_v1.0_ff
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
 
OCE - Cno 2014 private sector oriented open paas oce
OCE - Cno 2014 private sector oriented open paas   oceOCE - Cno 2014 private sector oriented open paas   oce
OCE - Cno 2014 private sector oriented open paas oce
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
Accelerate spring boot application with apache ignite
Accelerate spring boot application with apache igniteAccelerate spring boot application with apache ignite
Accelerate spring boot application with apache ignite
 
OPEN_POWER8_SESSION_20150316
OPEN_POWER8_SESSION_20150316OPEN_POWER8_SESSION_20150316
OPEN_POWER8_SESSION_20150316
 
Introduction to Apache Tajo
Introduction to Apache TajoIntroduction to Apache Tajo
Introduction to Apache Tajo
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영
 
Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AI
 
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
테스터도 알아야 할 웹 개발(테스트 교육 3장 1절 부분발췌)
 
마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기마이크로서비스 아키텍처로 개발하기
마이크로서비스 아키텍처로 개발하기
 
Micro Service Architecture의 이해
Micro Service Architecture의 이해Micro Service Architecture의 이해
Micro Service Architecture의 이해
 

주니어 개발자의 서버 로그 관리 개선기

  • 1. 주니어 개발자의 서버 로그 관리 개선기 Incheon/Songdo How to Improve Server Log Management as a Junior Developer
  • 2. 김연희 Yeonhee Kim - 스몰티켓 백엔드 개발자 - Girls in Tech Korea 운영진 - freeCodeCamp 한국어 번역 자원봉사자
  • 3. 오늘 발표에서 다룰 내용 - 로깅, 중앙 집중식 로깅, 로그 회전 개념 및 적용 - Java, Spring Boot에서의 실제 적용 중심 - PLG(Promtail, Loki, Grafana)를 통한 로그 중앙화 - Deep한 데이터 엔지니어링은 다루지 않습니다!
  • 5. 로그(Log) 애플리케이션, 네트워크 또는 서버에서 발생하는 모든 일에 대한 기록
  • 6. 로그의 중요성 - 사용자 문의 대응 - 에러 추적: 재현하기 힘든 버그에 대한 유용한 정보 제공 - 성능에 관한 통계와 정보 제공 - 데이터 지표 추출 - 법적 근거
  • 7. 기존 사내 로그 관리 시스템 AS-IS Incheon/Songdo
  • 8. 로그 필터링의 어려움 - 특정 로그의 중요도에 대한 기준 부재 - 중요하거나 필요한 로그만 따로 모아서 보기 어려움
  • 9. 로그 추적의 어려움 - 직접 서버 인스턴스별 터미널에 접속해야 함 - 멀티스레드 및 분산 환경에서 로그를 모아서 보기 어려움
  • 10. 방대한 로그 파일 용량 - 상용 서버 기준 인스턴스 하나당 하루 평균 600~700MB 크기의 애플리케이션 로그 파일이 적재되고 있음 - 로그 파일로 인해 스토리지 용량이 금방 차버림
  • 11. 로그를 어떻게 관리하면 좋을지 공부해서 개선해보자!
  • 13. 로깅 (Logging) - 시스템이나 프로그램에서 발생하는 중요한 이벤트나 정보를 기록함 = 로그(Log)를 생성함
  • 14. 로그 출력 방식 - 직접 출력하는 방식 - 로깅 라이브러리를 이용하는 방식
  • 15. 로깅 라이브러리를 사용하자! - 로그 메세지를 포함해서 다양한 상세 정보를 담을 수 있음 - (async 설정시) 성능도 로깅 라이브러리가 더 좋음!
  • 16. Java의 표준 로깅 라이브러리 Log4j Logback Log4j2 Slf4j Simple Logging Facade For Java
  • 17. Appender - 로그의 출력 위치와 형태를 설정하는 영역
  • 18. Appender - ConsoleAppender : 콘솔에 로그 출력 - FileAppender : 로그를 파일로 저장 - RollingFileAppender : 로그를 여러 개의 파일로 저장 - DBAppender : DB에 로그를 저장 - SMTPAppender : 메일로 로그를 보냄
  • 19. Filter - 특정 로그 레벨만 필터링하여 적용
  • 20. Log Level ERROR 애플리케이션에서 발생한 심각한 에러나 예외 WARN 잠재적으로 문제가 될 수 있는 경우 INFO 시스템에 대한 정보 제공(표준 로그 레벨) DEBUG 개발 또는 테스트 단계에서 디버깅 TRACE DEBUG 레벨보다 더 디테일한 메세지
  • 21. Encoder - Pattern을 사용해서 원하는 형식으로 로그 출력 Timestamp ISO8601 (표준 날짜 및 시간 형식)으로 기록 스레드 이름 로그 레벨 로거 이름 로그 메세지
  • 22. MDC - Mapped Diagnostic Contexts - 현재 실행중인 스레드에 메타 정보를 넣고 관리할 수 있는 공간 - Map (Key, Value) 형태이므로 관리 용이
  • 23. Client A Client B Thread A Thread B Server
  • 24. 멀티스레드 환경에서 로그가 뒤섞여서 요청별 흐름 파악이 어려움
  • 25. MDC에 Trace ID 넣기
  • 26. MDC에 Trace ID 넣기 - 코드를 어디에서 작성할까? Dispatcher Servlet Interceptor AOP Controller Filter Web Container Spring Context
  • 27. Encoder에 Trace ID 표기하기
  • 28. Root & Logger - 설정한 Appender를 참조해서 로그 레벨 설정 전역 설정 지역 설정
  • 29. 로그 메세지 작성시 유의점 - e.printStackTrace()를 쓰지 말자 - 내부적으로 System.err.println() 사용함
  • 30. 로그 메세지 작성시 유의점 - 에러 메세지를 분명하게 나타내자
  • 31. 로그 메세지 작성시 유의점 - 문자열 연산을 하지 말고 치환문자 {}를 사용하자 - 성능과 가독성 모두 좋아짐
  • 32. 로그 메세지 작성시 유의점 - 로그에 개인정보(사용자의 전화번호, 주소, 계좌번호, 비밀번호 등) 남기지 않기 - 로그 기록 전에 마스킹이나 암호화 처리하기
  • 33. 개선 #1 - 중요도에 따른 로깅 - 로그 레벨별로 모아보기 - 디버깅용 System.out.println() → log.debug() - e.printStackTrace() → log.error()로 대체 - 로그 중요도 재조정 - 과도한 log.error() → log.warn()으로 하향 - 디버깅 관련 log.info() → log.debug()
  • 34. 개선 #1 - 중요도에 따른 로깅 - 중요도에 따른 로그 파일 분리 - 전체 로그 파일 - ERROR 및 WARN 파일 - HTTP 요청/응답 파일
  • 35. 개선 #2 - 멀티스레드 환경에서 로그 조회 - Filter를 통해 MDC에 Trace ID를 넣기 - 이후 Trace ID를 통해 특정 요청의 흐름 추적 가능
  • 36. 중앙 집중식 로깅 Centralized Logging Incheon/Songdo
  • 37. 중앙 집중식 로깅 - 여러 시스템이나 장치에서 발생하는 로그 데이터를 하나의 위치에 모아 수집, 저장 및 관리하는 방식 Dashboard Storage Log Agent Log Agent
  • 38. 중앙 집중식 로깅의 필요성 - Zero-Downtime Deployment Load Balancer Instance A Instance B Client
  • 39. 중앙 집중식 로깅의 필요성 - MSA (Microservice Architecture) Monolithic Microservices
  • 40. 중앙 집중식 로깅 솔루션 - Amazon CloudWatch - AWS EC2와 연계가 쉽지만 요금이 들어감 💸 - ELK (Elasticsearch + Logstash + Kibana) - 강력한 검색 및 쿼리 기능을 제공하고 엔터프라이즈급에 적합 - 무겁고 러닝 커브와 구축 및 운영 리소스가 있음 - PLG (Promtail + Loki + Grafana) - 비교적 가볍고 설정이 어렵지 않으며 요구되는 리소스가 적음 - 대규모 데이터 처리에는 ELK보다 부족하며 레퍼런스가 비교적 적음
  • 42. PLG Stack - Promtail : 로그 수집 - Loki : 로그 저장 - Grafana : 로그 시각화(대시보드)
  • 43. Loki의 Indexing - 로그의 메타데이터만 인덱싱, 원본 로그 메세지는 인덱싱 ❌ - 자원의 소모가 적어 효율적인 운영 가능
  • 46. 개선 #3 - 분산 환경에서 로그 조회 - Grafana의 대시보드에서 로그 모아보기 - 분산 환경 로그 모아보기 - 전체 로그, WARN / ERROR 로그, HTTP 요청 / 응답 로그
  • 47.
  • 48. 개선 #4 - 분산 환경에서 로그 검색 - Promtail을 통해 주요 label 지정
  • 49.
  • 50. 개선 #4 - 분산 환경에서 로그 검색 - LogQL을 통한 검색 - LogQL : Grafana Loki의 쿼리 언어
  • 51.
  • 53. 로그 회전 (Log Rotation) - 너무 오래되었거나 너무 큰 로그 파일을 분할, 압축, 이동 (아카이브) 또는 삭제하는 자동화된 프로세스
  • 54. 로그 회전 전략 - 시간 기반 회전: 일정한 시간 간격에 따른 회전 - 크기 기반 회전: 고정된 크기 제한에 따른 회전 - 하이브리드 회전: 시간과 크기 중 먼저 달성되는 것에 따른 회전 - 압축: 회전 후 로그 파일 압축 - 삭제: 일정 기간이 지나거나 특정 파일 수에 도달했을 때 오래된 로그 파일 삭제
  • 55. Logrotate - 리눅스 시스템에서 로그 파일을 관리하기 위한 유틸리티 - 대부분의 리눅스 배포판에 보통 기본적으로 설치되어 있음
  • 56. Logback의 RollingFileAppender - RollingPolicy - SizeAndTimeBasedRollingPolicy : 하이브리드(시간+크기 기반) 회전
  • 57. 개선 #5 - 로그 회전 적용 - 로컬: ConsoleAppender로 콘솔에만 출력. 로그 파일 생성 ❌ - 개발 & 상용 - RollingFileAppender의 TimeBasedRollingPolicy 적용 - 개발은 30일 이전, 상용은 60일 이전 로그 파일 삭제 처리 - 파일명 : %d{yyyy-MM, aux}/%d-%i.log (2023-12/2023-12-10-0.log) - SizeAndTimeBasedFNATP로 일자별, 크기별(256MB)로 로그 파일 분할
  • 58. 개선 #6 - 로그 아카이브 - Loki 설정을 통해 Index, Chunks를 S3에 저장 Index Chunks
  • 59. 개선 #6 - 로그 아카이브 - 압축 파일을 AWS CLI를 통해 AWS S3로 전송 (상용에서만) - 해당되는 셸 스크립트 작성 - 어제 날짜 로그 파일 압축 처리 (압축 파일명에 인스턴스 ID 추가) - AWS CLI로 AWS S3로 압축 파일 전송
  • 60. 개선 #6 - 로그 아카이브 - Crontab을 통해 셸 스크립트를 주기적으로 실행 - 매일 오전 0시 10분에 AWS S3에 로그 압축 파일 업로드
  • 61. 개선 #7 - 보관 기간이 경과한 로그 삭제 - S3에서 주기적으로 파일이 자동 삭제되도록 규칙 생성 - 로그 보관 관련 법령과 회사 정책 참고 (ex: 5년 경과시 완전 삭제)
  • 62. Summary - 로그 필터링의 어려움 - 로그 레벨별로 중요도에 따른 로깅 - 중요도에 따른 로그 파일 분리 - 로그 추적의 어려움 - MDC를 이용한 Request 로깅 - PLG(Promtail, Loki, Grafana)를 통한 중앙 집중식 로깅 - 방대한 로그 파일 용량 - Logback에서 RollingFileAppender로 로그 회전 적용 - Crontab + AWS CLI를 통해 로그 압축 파일을 AWS S3로 전송 및 보관
  • 63. Conclusion - 절대적인 Best Solution은 없다! - 회사 상황, 재정, 개발팀 규모, 기술 숙련도 등에 따라 달라질 수 있음
  • 64. 향후 과제 - OpenTelemetry, Tempo를 활용한 MSA 환경 트레이싱 - Grafana에 Prometheus를 연동해서 Metric 시각화 - 실제 서비스 운영과 모니터링을 통한 지속적인 개선 - 데이터 분석과 연관된 유의미한 로그 추가해보기