[TOOL-008][중급] 로그로 오류를 다시 만들고 원인 찾기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[TOOL-008][중급] 로그로 오류를 다시 만들고 원인 찾기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 150회 작성일 26-09-03 04:35

본문

[이번 수업]
로그(log)는 프로그램 실행 중 일어난 일을 시간 순서로 남긴 기록입니다. 이번에는 필요한 사건과 맥락을 일정한 형식으로 기록하고, 같은 입력으로 문제를 다시 만드는 방법을 익힙니다.

[선수지식]
터미널에서 Python 파일을 실행할 수 있어야 합니다. 함수와 조건문을 알면 충분합니다. 설치 여부는 Windows에서 py --version, macOS·Linux에서 python3 --version으로 확인하세요.

[학습목표]
1. DEBUG·INFO·WARNING·ERROR·CRITICAL 수준을 상황에 맞게 구분한다.
2. 실행 식별자와 입력 요약으로 한 번의 실행 흐름을 찾는다.
3. 버전·명령·입력·기대 결과·실제 결과로 오류를 재현한다.

[핵심개념]
좋은 로그에는 사건 이름, 중요도, 발생 시각, 구성 요소, 실행 식별자와 결과가 들어갑니다. DEBUG는 자세한 진단, INFO는 정상 진행, WARNING은 예상 밖이지만 계속 가능한 상태, ERROR는 기능 실패, CRITICAL은 계속하기 어려운 심각한 상태에 씁니다. 운영 로그에 UTC 시각과 프로그램 버전을 남기면 여러 컴퓨터의 사건을 정렬하기 쉽습니다. 키=값처럼 필드를 고정한 구조화 로그는 검색하기 쉽고, run_id는 한 실행의 줄을 묶어 줍니다.

재현 기록은 ‘환경 → 실행 명령 → 최소 입력 → 기대 결과 → 실제 결과’ 순서로 씁니다. 난수나 시각에 따라 결과가 달라지면 시드(seed, 난수 시작값)와 시간대도 기록하세요. 로그는 크기·기간 기준으로 순환하고 보관 기간을 정합니다.

[따라하기]
아래를 log_demo.py로 저장하세요.

```python
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(levelname)s event=%(message)s",
)
logger = logging.getLogger("demo")

def divide(a, b, run_id):
    logger.info("division_started run_id=%s a=%s b=%s", run_id, a, b)
    if b == 0:
        logger.error("division_failed run_id=%s reason=zero_divisor", run_id)
        return None
    result = a / b
    logger.info("division_succeeded run_id=%s result=%s", run_id, result)
    return result

divide(10, 2, "run-001")
divide(10, 0, "run-002")
```

Windows PowerShell에서는 py log_demo.py 2> app.log, macOS·Linux에서는 python3 log_demo.py 2> app.log를 실행합니다. logging은 기본적으로 표준 오류에 쓰므로 2>가 이를 파일에 저장합니다. Windows는 Get-Content app.log, macOS·Linux는 cat app.log로 확인하세요.

예상 결과:
```text
INFO event=division_started run_id=run-001 a=10 b=2
INFO event=division_succeeded run_id=run-001 result=5.0
INFO event=division_started run_id=run-002 a=10 b=0
ERROR event=division_failed run_id=run-002 reason=zero_divisor
```
run-002 두 줄을 모으면 b=0 뒤 실패한 흐름이 보입니다. 재현 메모에는 Python 버전, 명령, 입력, 기대 동작, 실제 ERROR 줄을 적으세요.

[흔한 실수]
‘실패함’처럼 맥락 없는 문장만 남기거나 모두 ERROR로 기록하면 중요한 신호가 묻힙니다. 매번 다른 필드명과 여러 줄 문장을 쓰면 검색도 어렵습니다. 정상·실패 경로에 같은 식별자를 넣고, 예외의 맥락과 스택 추적은 남기되 같은 오류를 중복 기록하지 마세요.

[보안 주의]
비밀번호, 접근 토큰, 세션·쿠키, 암호화 키, 연결 문자열, 개인정보와 요청·응답 본문 전체를 로그에 넣지 않습니다. 필요한 값은 삭제·마스킹하고 읽기 권한과 보관 기간을 제한하세요. 외부 입력의 줄바꿈과 구분 문자는 검증·치환해 가짜 줄이 섞이는 로그 삽입을 막습니다. 연습은 본인 소유의 로컬 파일만 사용하세요.

[직접 해볼 과제]
divide에 12와 3을 넣은 run-003을 추가하고 함수 이름과 Python 버전이 포함된 재현 메모를 쓰세요. 곱셈 함수 multiply도 만들고 operation=multiply 필드로 두 연산을 구분해 보세요.

[확인문제]
1. 정상 진행과 기능 실패를 알리는 수준은 각각 무엇인가요?
2. 같은 실행의 여러 로그를 연결하는 필드는 무엇인가요?
3. 오류 재현 메모에 어떤 다섯 항목을 남겨야 하나요?

[다음 학습]
PY-008에서 클래스·데이터클래스·타입 힌트로 데이터와 동작을 명확하게 묶는 방법을 배웁니다.

[공식 참고 자료]
Python Logging HOWTO
https://docs.python.org/3/howto/logging.html

Python logging 라이브러리
https://docs.python.org/3/library/logging.html

OpenTelemetry Logs Data Model
https://opentelemetry.io/docs/specs/otel/logs/data-model/

OWASP Logging Cheat Sheet
https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
5,025
어제
6,862
최대
16,772
전체
770,976
Copyright © 소유하신 도메인. All rights reserved.