<aside>
</aside>
μλ
νμΈμ! loguru μμ μ 볡μ μ¬μ μ΄ κ³μλ©λλ€. μ°λ¦¬λ level νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ νΉμ μ¬κ°λ μ΄μμ λ‘κ·Έλ§ κΈ°λ‘νλ, κΈ°λ³Έμ μΈ νν°λ§μ μ΄λ―Έ μ¬μ©ν΄μμ΅λλ€. νμ§λ§ μ€λ¬΄μμλ ν¨μ¬ λ 볡μ‘ν μꡬμ¬νμ΄ μκΈ°μ£ . "κ²°μ λͺ¨λμμ λ°μν λ‘κ·Έλ§ λ°λ‘ λͺ¨μλ³΄κ³ μΆμ΄!", "λΉλ°λ²νΈκ° ν¬ν¨λ λ‘κ·Έλ μ λ νμΌμ λ¨κΈ°λ©΄ μ λΌ!" μ κ°μ΄ λ§μ΄μμ. ποΈ
μ΄λ² μ±ν°μμλ logger.add() ν¨μμ filter νλΌλ―Έν°λ₯Ό μ¬μ©νμ¬, λ¨μν λ 벨 νν°λ§μ λμ΄ μ°λ¦¬λ§μ 컀μ€ν
κ·μΉμΌλ‘ λ‘κ·Έμ νλ¦μ μ μ΄νλ 'λμ νν°λ§' κΈ°λ²μ λ°°μλ΄
λλ€. loguruμ λλν κ΅ν΅ κ΄μ μ¬λ₯Ό κ³ μ©νμ¬, μνλ λ‘κ·Έλ§ μ νν λͺ©μ μ§λ‘ μλ΄νλ λ°©λ²μ λ§μ€ν°ν΄ 보μΈμ!
μ΄λ² μ±ν°λ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ κ±°μμ!
logger.add()μ filter νλΌλ―Έν°λ₯Ό μ¬μ©νμ¬ κ³ κΈ νν°λ§ κ·μΉμ μ μ©ν μ μμ΅λλ€.bind()λ‘ μΆκ°λ 컨ν
μ€νΈ μ 보λ₯Ό κΈ°λ°μΌλ‘, νΉμ μ¬μ©μ(μ: κ΄λ¦¬μ)μ νλ λ‘κ·Έλ§ λ³λμ νμΌμ κΈ°λ‘ν μ μμ΅λλ€.loguru-mastery ν΄λμ dynamic_filtering.py νμΌμ μλ‘ μΆκ°νμ¬ μ€μ΅ν©λλ€. μ΄ μ½λλ μ¬λ¬ κ°μ μ±ν¬μ κ°κΈ° λ€λ₯Έ νν°λ₯Ό μ μ©νμ¬, λ‘κ·Έκ° μ΄λ»κ² μ νμ μΌλ‘ κ°κΈ° λ€λ₯Έ νμΌμ μ μ₯λλμ§λ₯Ό 보μ¬μ€λλ€.
νλ‘μ νΈ κ΅¬μ‘°
loguru-mastery/
βββ venv/
βββ requirements.txt
βββ custom_levels.py
βββ dynamic_filtering.py <- μλ‘ μΆκ°λ νμΌ!
βββ admin_actions.log <- μ€ν ν μμ±λ νμΌ 1
βββ secure_general.log <- μ€ν ν μμ±λ νμΌ 2
dynamic_filtering.py μ 체 μ½λ
# dynamic_filtering.py
import sys
from loguru import logger
logger.remove()
# --- μ±ν¬ 1: κ΄λ¦¬μ(admin-007)μ λ‘κ·Έλ§ admin_actions.log νμΌμ κΈ°λ‘ ---
# filterλ λ¬Έμμ΄/ν¨μ/λμ
λ리λ₯Ό μΈμλ‘ λ°μμΌ ν©λλ€.
# record["extra"]μ user_idκ° μκ³ , κ·Έ κ°μ΄ 'admin-007'μΌ λλ§ Trueλ₯Ό λ°νν©λλ€.
logger.add(
"admin_actions.log",
level="INFO",
filter=lambda record: record["extra"].get("user_id") == "admin-007"
)
# --- μ±ν¬ 2: 'password'κ° ν¬ν¨λ λ―Όκ°ν λ‘κ·Έλ μ μΈνκ³ secure_general.log νμΌμ κΈ°λ‘ ---
logger.add(
"secure_general.log",
level="INFO",
filter=lambda record: "password" not in record["message"].lower()
)
# --- μ±ν¬ 3: μ½μμλ INFO μ΄μμ λͺ¨λ λ‘κ·Έλ₯Ό μΆλ ₯νμ¬ νν°λ§ λμμ λΉκ΅ ---
logger.add(sys.stderr, level="INFO")
def user_task(user_id, task_description):
# βcontextualize()λ₯Ό μ¬μ©νμ¬ λͺ¨λ λ‘κ·Έμ user_id 컨ν
μ€νΈλ₯Ό μΆκ°ν©λλ€.
with logger.contextualize(user_id=user_id):
logger.info(task_description)
if __name__ == "__main__":
print("--- λμ νν°λ§ ν
μ€νΈ μμ ---")
user_task("user-123", "κ²μκΈμ μμ±νμ΅λλ€.")
user_task("admin-007", "μμ€ν
μ€μ μ λ³κ²½νμ΅λλ€.")
user_task("user-456", "λΉλ°λ²νΈλ₯Ό λ³κ²½νμ΅λλ€. new_password=...hidden...")
user_task("admin-007", "μλ‘μ΄ μ¬μ©μλ₯Ό μ΄λνμ΅λλ€.")
print("\\\\n--- ν
μ€νΈ μ’
λ£ ---")
print("μ½μ μΆλ ₯κ³Ό 'admin_actions.log', 'secure_general.log' νμΌμ λ΄μ©μ λΉκ΅ν΄λ³΄μΈμ.")
filter νλΌλ―Έν° μ¬ν νμ΅logger.add()μ filter νλΌλ―Έν°λ levelλ³΄λ€ ν¨μ¬ λ μ κ΅ν 'λ¬Έμ§κΈ°' μν μ ν©λλ€. μ΄ λ¬Έμ§κΈ°μκ² μ°λ¦¬λ ν΅κ³Όμν¬ λ‘κ·Έμ λν 'νΉλ³ κ·μΉ'μ μλ €μ€ μ μμ£ .