<aside>
</aside>
μλ νμΈμ! μ§κΈκΉμ§ μ°λ¦¬λ μ¬λμ΄ μ½κΈ° μ’μ λ‘κ·Έλ₯Ό λ§λλ λ° μ§μ€ν΄μμ΅λλ€. νμ§λ§ μ€μ μ΄μ νκ²½μμλ ν루μ μλ°±λ§, μμ²λ§ 건μ λ‘κ·Έκ° μμμ Έμ. μ΄ λ°©λν μμ λ‘κ·Έλ₯Ό μ¬λμ΄ μΌμΌμ΄ λμΌλ‘ μ½κ³ λΆμνλ κ²μ λΆκ°λ₯μ κ°κΉμ΅λλ€. π΅οΈβ‘οΈπ»
μ΄λ² μ±ν°μμλ λ‘κ·Έμ μ΅μ’
μλΉμκ° 'μ¬λ'μ΄ μλ 'κΈ°κ³'κ° λλ μΈμμ λ§λλ΄
λλ€. λ‘κ·Έ λΆμ μμ€ν
μ΄ κ°μ₯ μ’μνλ μμμΈ JSON νμμΌλ‘ λ‘κ·Έλ₯Ό λ¨κΈ°λ λ°©λ²μ λ°°μΈ κ±°μμ. logger.add()μ λ¨ νλμ νλΌλ―Έν°, serialize=Trueλ₯Ό μΆκ°νλ κ²λ§μΌλ‘ μ¬λ¬λΆμ λ‘κ·Έκ° μΌλ§λ λλν΄μ§ μ μλμ§ μ§μ νμΈν΄ 보μΈμ!
μ΄λ² μ±ν°λ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ κ±°μμ!
serialize=True νλΌλ―Έν°λ₯Ό μ¬μ©νμ¬ λͺ¨λ λ‘κ·Έλ₯Ό JSON νμμΌλ‘ μμ½κ² λ³νν μ μμ΅λλ€.bind()λ‘ μΆκ°ν 컨ν
μ€νΈ λ°μ΄ν°κ° JSONμ μ΄λ»κ² ν¬ν¨λλμ§, κ·Έλ¦¬κ³ μ΄κ²μ΄ λ‘κ·Έ κ²μ λ° νν°λ§μ μΌλ§λ κ°λ ₯νκ² λ§λλμ§ κΉ¨λ«κ² λ©λλ€.structured_logging.py νμΌμ μλ‘ μΆκ°νμ¬ μ€μ΅ν©λλ€. μ½λλ₯Ό μ€ννλ©΄, λͺ¨λ λ‘κ·Έκ° ν μ€μ© JSON νμμΌλ‘ κΉλνκ² μ μ₯λ structured_log.json νμΌμ΄ μμ±λ©λλ€.
νλ‘μ νΈ κ΅¬μ‘°
loguru-course/
βββ venv/
βββ ... (μ΄μ κ°μ νμΌλ€)
βββ structured_logging.py <- μλ‘ μΆκ°λ νμΌ!
βββ structured_log.json <- μ½λ μ€ν ν μμ±λ νμΌ!
structured_logging.py μ 체 μ½λ
# structured_logging.py
import sys
import uuid
from loguru import logger
# 1. κΈ°λ³Έ νΈλ€λ¬ μ κ±°
logger.remove()
# 2. JSON μΆλ ₯μ μν νμΌ μ±ν¬ μΆκ°
# serialize=True νλΌλ―Έν° νλλ‘ λͺ¨λ λ‘κ·Έ λ μ½λκ° JSON νμμΌλ‘ λ³νλ©λλ€.
logger.add("structured_log.json", serialize=True)
# 3. λΉκ΅λ₯Ό μν΄, μ¬λμ΄ μ½κΈ° μ’μ μΌλ° ν
μ€νΈ λ‘κ·Έλ₯Ό μ½μμλ μΆλ ₯ν©λλ€.
logger.add(sys.stderr, level="INFO")
def handle_payment(user_id, amount):
# κ° κ²°μ μ²λ¦¬λ§λ€ κ³ μ ν transaction_idλ₯Ό λΆμ¬ν©λλ€.
tx_id = f"tx-{uuid.uuid4().hex[:12]}"
# transaction_idμ user_idλ₯Ό 컨ν
μ€νΈμ λ°μΈλ©ν©λλ€.
payment_logger = logger.bind(transaction_id=tx_id, user_id=user_id)
payment_logger.info(f"κ²°μ μλ: {amount}μ")
if amount > 100000:
payment_logger.warning("κ³ μ‘ κ²°μ (10λ§μ μ΄κ³Ό)μ
λλ€. μΆκ° μΈμ¦μ΄ νμν μ μμ΅λλ€.")
# ... κ°μμ κ²°μ μ²λ¦¬ λ‘μ§ ...
payment_logger.success("κ²°μ μ²λ¦¬κ° μ±κ³΅μ μΌλ‘ μλ£λμμ΅λλ€.")
if __name__ == "__main__":
handle_payment("user-jane", 50000)
handle_payment("user-john", 150000)
μ¬λμ λμλ μΌλ° ν μ€νΈ λ‘κ·Έκ° μ½κΈ° νΈνμ§λ§, κΈ°κ³μκ²λ κ·Έμ μλ―Έ μλ λ¬Έμμ΄μ λμ΄μΌ λΏμ΄μμ. μλ₯Ό λ€μ΄, "user-johnμ κ²°μ κ° μ€ν¨νμ΅λλ€" λΌλ λ‘κ·Έμμ 'user-john'μ΄λΌλ μ¬μ©μ μμ΄λλ§ λ½μλ΄λ €λ©΄ 볡μ‘ν λ¬Έμμ΄ μ²λ¦¬(νμ±)κ° νμν©λλ€.
***ꡬ쑰ν λ‘κΉ
(Structured Logging)***μ λͺ¨λ λ‘κ·Έλ₯Ό key-value νν, μ¦ JSONμ²λΌ λͺ
νν ꡬ쑰λ₯Ό κ°μ§ λ°μ΄ν°λ‘ κΈ°λ‘νλ λ°©μμ
λλ€. μ΄λ κ² νλ©΄ κΈ°κ³(λ‘κ·Έ λΆμ μμ€ν
)κ° κ° λ‘κ·Έμ μμ±μ μμ£Ό μ½κ² μ΄ν΄νκ³ , κ°λ ₯ν κ²μκ³Ό λΆμ, μκ°νλ₯Ό μνν μ μκ² λ©λλ€.