Notice
Recent Posts
Recent Comments
올해는 머신러닝이다.
개발시 로그를 효율적으로 남기는 방법 본문
로그(logging)는 개발과 운영에서 매우 중요한 요소야. 로그를 잘 남기면 디버깅, 문제 해결, 성능 분석, 보안 감사 등에 큰 도움이 돼. 여기서는 효율적으로 로그를 남기는 방법을 정리해볼게.
🔹 1. 로그의 목적을 명확히 하자
로그는 단순한 출력이 아니라 분석과 문제 해결을 위한 기록이야. 따라서 로그를 남길 때는 다음을 고려해야 해.
- 디버깅을 위한 로그: 개발 중 코드의 흐름을 확인하는 용도
- 운영 로그: 실제 서비스에서 발생하는 오류, 사용자 활동 기록
- 보안 로그: 권한 변경, 로그인 시도, 데이터 접근 기록 등
목적에 맞게 로그 레벨을 적절히 사용해야 해.
🔹 2. 로그 레벨(Level)을 올바르게 사용하자
로그 레벨을 잘 구분해야 로그 관리가 쉬워져.
레벨 설명 사용 예시
DEBUG | 상세한 디버깅 정보 | 변수 값, 함수 호출 확인 |
INFO | 일반적인 운영 정보 | 서비스 시작, 주요 이벤트 발생 |
WARN | 경고 (치명적이지 않지만 조치 필요) | 성능 저하, 의심스러운 요청 |
ERROR | 오류 발생 (즉시 조치 필요) | 예외 발생, API 실패 |
FATAL | 치명적인 오류 (서비스 중단 가능) | 데이터베이스 다운, 시스템 크래시 |
예제 코드 (Python logging 모듈):
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug("이것은 디버그 로그입니다.")
logging.info("이것은 정보 로그입니다.")
logging.warning("이것은 경고 로그입니다.")
logging.error("이것은 오류 로그입니다.")
logging.critical("이것은 치명적 오류 로그입니다.")
🔹 3. 적절한 로그 포맷을 사용하자
로그가 많아질수록 분석이 어려워지므로, 일관된 형식으로 남기는 것이 중요해.
📌 기본적인 로그 포맷
[날짜] [시간] [로그 레벨] [파일명] [라인번호] [메시지]
예제 (Python):
import logging
logging.basicConfig(
format='%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
level=logging.INFO
)
logging.info("이것은 잘 정리된 로그입니다.")
출력 예시:
2025-03-06 12:34:56,789 - INFO - main.py:10 - 이것은 잘 정리된 로그입니다.
🔹 4. 민감한 정보는 로그에 남기지 말자 🚨
로그에 개인정보, 비밀번호, 카드번호 등을 포함하면 안 돼.
예를 들어, 이런 로그는 피해야 해.
🚫 잘못된 로그 예시
[ERROR] 비밀번호 검증 실패 - 입력된 비밀번호: 123456
✅ 올바른 로그 예시
[ERROR] 비밀번호 검증 실패 - user_id: 1002
🔹 5. 로그는 한 곳에 모으고 분석하자
운영 환경에서는 로그를 중앙 집중화하는 것이 중요해.
- 파일 로그 저장: logfile.log 같은 파일로 기록
- 로그 관리 시스템 활용: ELK(Stack), Grafana Loki, Datadog, AWS CloudWatch
- 분산 로그 시스템: 마이크로서비스 환경에서는 Fluentd, Graylog, Splunk 같은 도구를 사용
예제 (파일에 로그 저장):
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
logging.info("이것은 파일에 저장되는 로그입니다.")
🔹 6. 실행 환경에 따라 로그를 다르게 남기자
개발 환경과 운영 환경에서는 로그 레벨을 다르게 설정해야 해.
import logging
import os
env = os.getenv('APP_ENV', 'development')
if env == 'production':
logging.basicConfig(level=logging.WARNING)
else:
logging.basicConfig(level=logging.DEBUG)
logging.info("운영 환경에 따라 로그 레벨이 다르게 설정됩니다.")
🔹 7. 성능을 고려한 로그 관리
로그를 너무 많이 남기면 성능이 떨어질 수 있어.
이를 방지하려면:
- 중요한 로그만 남기기 (DEBUG 로그를 과하게 남기지 말 것)
- 비동기 로그 처리 (queue 사용)
- 로그 압축 및 보관 정책 (logrotate 사용)
예제 (Python RotatingFileHandler 사용):
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler("app.log", maxBytes=1000000, backupCount=5)
logging.basicConfig(handlers=[handler], level=logging.INFO)
logging.info("로그가 일정 크기가 되면 자동으로 순환됩니다.")
🔹 8. API 요청/응답을 기록할 때 주의할 점
API 로그를 남길 때는 다음을 고려해야 해.
- 요청/응답을 로깅하되, 개인정보는 마스킹할 것
- 속도를 고려하여 로그를 비동기 방식으로 저장할 것
- 모든 에러 응답을 반드시 로깅할 것
🚫 잘못된 API 로그 예시 (개인정보 포함)
{
"timestamp": "2025-03-06T12:30:00",
"method": "POST",
"endpoint": "/login",
"request": {
"username": "user123",
"password": "mypassword"
},
"response": {
"status": 200,
"message": "로그인 성공"
}
}
✅ 올바른 API 로그 예시 (마스킹 적용)
{
"timestamp": "2025-03-06T12:30:00",
"method": "POST",
"endpoint": "/login",
"request": {
"username": "user123",
"password": "****"
},
"response": {
"status": 200,
"message": "로그인 성공"
}
}
✅ 결론: 좋은 로그의 8가지 원칙
- 로그의 목적을 명확히 한다.
- 적절한 로그 레벨을 사용한다.
- 일관된 로그 포맷을 유지한다.
- 민감한 정보를 기록하지 않는다.
- 로그를 중앙 집중화하여 관리한다.
- 실행 환경에 따라 로그 설정을 다르게 한다.
- 성능에 영향을 주지 않도록 로그를 관리한다.
- API 요청/응답 로그를 기록할 때 주의한다.
이제 개발할 때 적절한 로그를 남기고, 효과적으로 관리하는 방법을 적용해보면 돼!
'스터디' 카테고리의 다른 글
Nginx에서 sites-enabled 디렉터리에 설정 파일을 링크하는 방법 (0) | 2025.03.04 |
---|---|
next/image에서 모든 이미지 도메인 허용하기 (0) | 2025.02.28 |
실시간 협업 서비스 Liveblocks 소개 (0) | 2025.02.27 |
Clerk (프론트 인증 모듈 추천) (0) | 2025.02.27 |
Convex DB (프론트와 완벽한 풀스택 디비) (0) | 2025.02.27 |