<aside>
</aside>
μλ νμΈμ! μ§κΈκΉμ§ μ°λ¦¬λ μ ν΄μ§ λ¬Έμμ΄μ λ‘κ·Έλ‘ λ¨κ²¨μμ΅λλ€. νμ§λ§ μ€μ νλ‘κ·Έλ¨μμλ 'μ΄λ€ μ¬μ©μ'κ° 'λͺ μμ' '무μμ' νλμ§μ κ°μ΄, κ³μν΄μ λ³νλ λμ μΈ λ°μ΄ν°λ₯Ό λ‘κ·Έμ λ΄μμΌ ν λκ° ν¨μ¬ λ§μμ. π΅οΈ
μ΄λ² μ±ν°μμλ λ‘κ·Έ λ©μμ§μ λ³μλ₯Ό μμ½κ² ν¬ν¨μν€λ λ°©λ²μ λ°°μ°κ³ , ν λ¨κ³ λ λμκ° μ¬λ¬ λ‘κ·Έλ₯Ό νλμ 'μ΄μΌκΈ°'λ‘ λ¬Άμ΄μ£Όλ κ°λ ₯ν κΈ°λ₯μΈ μ»¨ν
μ€νΈ(Context) μΆκ°μ λν΄ μμλ΄
λλ€. logger.bind()λ₯Ό μ¬μ©ν΄ κ°κΈ° ν©μ΄μ§ λ‘κ·Έμ 'μμ² ID'μ κ°μ κ³ μ ν 꼬리νλ₯Ό λΆμ¬, 볡μ‘ν μμ
μ νλ¦λ νλμ μΆμ ν μ μκ² λ§λ€μ΄ λ΄
μλ€!
μ΄λ² μ±ν°λ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ κ±°μμ!
logger.info("User {} logged in", user_id)μ²λΌ λ‘κ·Έ λ©μμ§μ λ³μλ₯Ό κ°λ¨νκ² ν¬ν¨μν¬ μ μμ΅λλ€.logger.bind() λ©μλλ₯Ό μ¬μ©νμ¬ νΉμ 컨ν
μ€νΈ μ 보(μ: request_id)λ₯Ό κ°μ§ μλ‘μ΄ λ‘κ±°λ₯Ό μμ±ν μ μμ΅λλ€.{extra} λμ
λ리λ₯Ό μ¬μ©νμ¬ bind()λ‘ μΆκ°λ μ 보λ₯Ό λ‘κ·Έ ν¬λ§·μ νμν μ μμ΅λλ€.contextual_logging.py νμΌμ μλ‘ μΆκ°νμ¬, κ°λ¨ν λ©μμ§ ν¬λ§€ν
κ³Ό bind()λ₯Ό μ¬μ©ν 컨ν
μ€νΈ λ‘κΉ
μ λΉκ΅νλ©° μ€μ΅ν©λλ€.
νλ‘μ νΈ κ΅¬μ‘°
loguru-course/
βββ venv/
βββ ... (μ΄μ κ°μ νμΌλ€)
βββ contextual_logging.py <- μλ‘ μΆκ°λ νμΌ!
contextual_logging.py μ 체 μ½λ
# contextual_logging.py
import sys
import uuid
from loguru import logger
# 1. κΈ°λ³Έ νΈλ€λ¬ μ κ±° λ° μ»€μ€ν
ν¬λ§· μ€μ
# {extra} λμ
λ리λ₯Ό μ¬μ©νμ¬ bind()λ‘ μΆκ°λ λ°μ΄ν°λ₯Ό μΆλ ₯ν μ리λ₯Ό λ§λ ¨ν©λλ€.
logger.remove()
log_format = (
"{time:HH:mm:ss} | {level: <8} | "
"{extra[request_id]} | " # bind()λ‘ μΆκ°λ request_idλ₯Ό νμν λΆλΆ
"{name}:{function}:{line} - {message}"
)
# κΈ°λ³Έ λ°μΈλ©μ΄ μλ€λ©΄ keyErrorκ° λ°μν μ μμ΄μ!
logger = logger.bind(request_id="-")
logger.add(sys.stderr, format=log_format)
# --- λ°©λ² 1: κ°λ¨ν λ©μμ§ ν¬λ§€ν
---
def simple_log_event(user, action):
# logger.info()μ λ©μμ§ ν
νλ¦Ώκ³Ό λ³μλ₯Ό μ°¨λ‘λ‘ μ λ¬ν©λλ€.
logger.info("μ¬μ©μ '{}'κ° '{}' μ‘μ
μ μννμ΅λλ€.", user, action)
# --- λ°©λ² 2: bind()λ₯Ό μ¬μ©ν 컨ν
μ€νΈ μΆκ° ---
def process_request(request_data):
# κ° μμ²λ§λ€ κ³ μ ν IDλ₯Ό μμ±νμ¬, μ΄λ€ λ‘κ·Έκ° μ΄λ€ μμ²μ μνλμ§ μΆμ ν©λλ€.
request_id = str(uuid.uuid4())[:8]
# bind()λ₯Ό μ¬μ©νμ¬ request_idλ₯Ό 컨ν
μ€νΈμ 'λ°μΈλ©'ν μλ‘μ΄ λ‘κ±°λ₯Ό μμ±ν©λλ€.
context_logger = logger.bind(request_id=request_id)
context_logger.info("μμ² μ²λ¦¬ μμ: {}", request_data)
context_logger.debug("λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©μ μ 보λ₯Ό μ‘°νν©λλ€...")
if "error" in request_data:
context_logger.error("μμ² λ°μ΄ν°μ μ€λ₯κ° ν¬ν¨λμ΄ μμ΅λλ€.")
else:
context_logger.success("μμ² μ²λ¦¬λ₯Ό μ±κ³΅μ μΌλ‘ μλ£νμ΅λλ€.")
if __name__ == "__main__":
print("--- 1. κ°λ¨ν λ©μμ§ ν¬λ§€ν
ν
μ€νΈ (컨ν
μ€νΈ ID μμ) ---")
# extraμ request_idκ° μμΌλ―λ‘ ν΄λΉ νλλ λΉμ΄μκ² λ©λλ€.
simple_log_event("alice", "λ‘κ·ΈμΈ")
print("\\n" + "="*50 + "\\n")
print("--- 2. bind()λ₯Ό μ¬μ©ν 컨ν
μ€νΈ λ‘κΉ
ν
μ€νΈ ---")
process_request({"user": "bob", "data": "some_payload"})
print("-" * 20)
process_request({"user": "charlie", "data": "another_payload", "error": True})
λ‘κ·Έ λ©μμ§μ λ³μλ₯Ό ν¬ν¨μν€λ κ°μ₯ κ°λ¨ν λ°©λ²μ loggerμ λ‘κΉ
λ©μλ(info, debug λ±)κ° νμ΄μ¬μ str.format() λ©μλμ²λΌ λμνλ€λ μ μ μ΄μ©νλ κ²μ
λλ€.