«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

개발시 로그를 효율적으로 남기는 방법 본문

스터디

개발시 로그를 효율적으로 남기는 방법

행복한 수지아빠 2025. 3. 6. 14:39

로그(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가지 원칙

  1. 로그의 목적을 명확히 한다.
  2. 적절한 로그 레벨을 사용한다.
  3. 일관된 로그 포맷을 유지한다.
  4. 민감한 정보를 기록하지 않는다.
  5. 로그를 중앙 집중화하여 관리한다.
  6. 실행 환경에 따라 로그 설정을 다르게 한다.
  7. 성능에 영향을 주지 않도록 로그를 관리한다.
  8. API 요청/응답 로그를 기록할 때 주의한다.

이제 개발할 때 적절한 로그를 남기고, 효과적으로 관리하는 방법을 적용해보면 돼!