0Pricing
Python Academy · 강의

구조화된 로깅

기계가 읽을 수 있는 출력을 위해 JSON 형식의 로그를 기록합니다.

구조화된 로깅은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

구조화된 로그 기록이란

구조화된 로그 기록은 자유 형식 텍스트 대신 로그 레코드를 기계가 읽을 수 있는 데이터(JSON)로 출력하므로 색인, 검색, 알림 설정이 쉽습니다.

import logging, json

def log_json(level, msg, **kw):
    record = {"level": level, "msg": msg, **kw}
    print(json.dumps(record))

log_json("INFO", "Request received", path="/api/users", method="GET")

사용자 지정 JSON 형식 지정기

logging.Formatter를 상속하면 일반 텍스트 대신 JSON을 출력할 수 있습니다.

import logging, json

class JSONFormatter(logging.Formatter):
    def format(self, record):
        return json.dumps({
            "time": self.formatTime(record),
            "level": record.levelname,
            "name": record.name,
            "msg": record.getMessage(),
        })

handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)

python-json-logger

python-json-logger 패키지는 표준 필드와 추가 필드를 지원하는 готов형 JSON 형식 지정기를 제공합니다.

# pip install python-json-logger
import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(jsonlogger.JsonFormatter())
logger.addHandler(handler)
logger.info("User created", extra={"user_id": 42})

structlog

structlog는 컨텍스트 누적과 형식 지정을 분리하고 프로세서 처리 과정을 지원하는 인기 있는 서드파티 라이브러리입니다.

# pip install structlog
import structlog

log = structlog.get_logger()
log = log.bind(request_id="abc123")
log.info("payment_processed", amount=49.99, currency="USD")

structlog로 컨텍스트 바인딩

structlog를 사용하면 로거에 키-값 쌍을 바인딩하여 이후의 모든 호출에 전달할 수 있습니다.

import structlog

log = structlog.get_logger().bind(
    service="auth",
    env="prod"
)
log.warning("login_failed", user="alice", reason="bad_password")
# {service:auth, env:prod, user:alice, reason:bad_password}

타임스탬프와 호출자 정보 추가

프로세서는 레코드를 자동으로 보강할 수 있습니다. 모든 로그 레코드에 TimeStamper와 CallsiteParameterAdder를 추가합니다.

import structlog

structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.CallsiteParameterAdder([structlog.processors.CallsiteParameter.FILENAME]),
        structlog.processors.JSONRenderer(),
    ]
)

웹 앱에서 요청 ID 기록

웹 프레임워크에서는 각 요청이 시작될 때 요청 ID를 바인딩하여 해당 요청 중 생성되는 모든 로그 줄에 요청 ID가 포함되도록 합니다.

import structlog

def middleware(request, call_next):
    req_id = request.headers.get("X-Request-Id", generate_id())
    log = structlog.get_logger().bind(request_id=req_id)
    log.info("request_started", path=request.url.path)
    response = call_next(request)
    log.info("request_finished", status=response.status_code)
    return response

ECS 로그 형식

Elastic Common Schema(ECS)는 Elastic Stack에서 사용하는 표준 JSON 로그 형식입니다. Python에서는 ecs-logging을 사용합니다.

# pip install ecs-logging
import logging
import ecs_logging

logger = logging.getLogger("app")
handler = logging.StreamHandler()
handler.setFormatter(ecs_logging.StdlibFormatter())
logger.addHandler(handler)
logger.info("Event logged in ECS format")

로그 집계 시스템

구조화된 JSON 로그는 Elasticsearch/Kibana(ELK), Grafana Loki, Datadog, AWS CloudWatch Logs Insights와 같은 집계 도구로 자연스럽게 흘러갑니다.

# Loki query example:
# {app="myservice"} | json | level="ERROR"

# CloudWatch Insights:
# fields @timestamp, level, msg
# | filter level = "ERROR"
# | sort @timestamp desc

로그에서 PII 피하기

로그를 기록하기 전에 개인 식별 정보를 제거하세요. 사용자 지정 프로세서나 필터를 사용해 이메일, 토큰, 비밀번호를 마스킹합니다.

import re

def mask_pii(_, __, event_dict):
    msg = event_dict.get("event", "")
    event_dict["event"] = re.sub(
        r"[\w.+-]+@[\w-]+\.[\w.]+", "***@***.***", msg
    )
    return event_dict

구조화된 로그와 비구조화된 로그의 절충점

구조화된 로그는 검색과 알림 설정이 쉽지만 장황합니다. 환경 기반 설정을 사용해 운영 환경에서는 구조화된 로그 기록을, 개발 환경에서는 사람이 읽기 쉬운 형식을 함께 사용하세요.

import structlog, os

if os.getenv("ENV") == "production":
    renderer = structlog.processors.JSONRenderer()
else:
    renderer = structlog.dev.ConsoleRenderer()

structlog.configure(processors=[renderer])

빠른 확인

일반 텍스트 로그보다 JSON 구조화 로그가 갖는 가장 큰 장점은 무엇인가요?

복습

구조화된 로그 기록은 키-값 JSON 레코드를 출력합니다. JSONFormatter, python-json-logger 또는 structlog를 사용하세요. 작업 시작 시 컨텍스트(요청 ID, 사용자)를 바인딩하면 해당 작업 중 생성되는 모든 로그 줄에 컨텍스트가 포함됩니다.

자주 묻는 질문

“구조화된 로깅” 강의는 무료인가요?

네 — “구조화된 로깅” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“구조화된 로깅”에서 뭘 배우나요?

기계가 읽을 수 있는 출력을 위해 JSON 형식의 로그를 기록합니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Python Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“구조화된 로깅” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. logging 모듈 기초
  2. 핸들러, 포매터 및 필터
  3. 구조화된 로깅
  4. pdb로 디버깅하기
← Python Academy(으)로 돌아가기