π μΈμ
κ°μ
- μ£Όμ : Python λ‘κΉ
μμ€ν
κ΅¬μΆ λ° μ΄ν΄
- κΈ°μ€ μ½λ: insupanda-ragμ
src/config/logger.py
- νμ΅ λ°©μ: μ§μ νμ΄ν + μμΈ μ£ΌμμΌλ‘ κ°λ
νμ΅
- μμ± κ²°κ³Ό: μ½μκ³Ό νμΌμ λμ μΆλ ₯λλ λ‘κΉ
μμ€ν
π ν΅μ¬ κ°λ
νμ΅
1. λ‘κΉ
(Logging)μ΄λ?
- μ μ: νλ‘κ·Έλ¨ μ€ν μ€ λ°μνλ μ΄λ²€νΈλ€μ κΈ°λ‘νλ μμ€ν
- λΉμ : νλ‘κ·Έλ¨μ "μΌκΈ°μ₯" - μΈμ λ¬΄μ¨ μΌμ΄ μΌμ΄λ¬λμ§ μμΈ κΈ°λ‘
- νμμ±: λλ²κΉ
, λͺ¨λν°λ§, λΆμ, μ¦κ±° 보μ
2. λ‘κΉ
λ 벨 5λ¨κ³
DEBUG < INFO < WARNING < ERROR < CRITICAL
- DEBUG: κ°λ°μμ© μμΈ μ 보 (κ°μ₯ μμΈν¨)
- INFO: μΌλ°μ μΈ μ 보 β μ°λ¦¬ νλ‘μ νΈμμ μ¬μ©
- WARNING: κ²½κ³ λ©μμ§
- ERROR: μλ¬ λ°μ
- CRITICAL: μΉλͺ
μ μ€λ₯ (κ°μ₯ μ¬κ°ν¨)
3. νΈλ€λ¬(Handler) κ°λ
λ‘κ·Έλ₯Ό "μ΄λμ" 보λΌμ§ κ²°μ νλ λ°°λ¬μ μν
StreamHandler
- μν : μ½μ(ν°λ―Έλ νλ©΄)μ μ€μκ° μΆλ ₯
- μ₯μ : μ¦μ νμΈ κ°λ₯, κ°λ° μ€ λλ²κΉ
μ©μ΄
- λ¨μ : νλ‘κ·Έλ¨ μ’
λ£ μ μ¬λΌμ§
FileHandler
- μν : νμΌμ μꡬ μ μ₯
- μ₯μ : μꡬ 보κ΄, λμ€μ λΆμ κ°λ₯
- μ€μ :
("app.log", "a", "utf-8")
"app.log": νμΌλͺ
"a": append λͺ¨λ (κΈ°μ‘΄ λ΄μ©μ μΆκ°)
"utf-8": νκΈ μ§μ μΈμ½λ©
π» μ€μ΅ κ³Όμ
1. νλ‘μ νΈ κ΅¬μ‘° νμΈ
insurance-rag-learning/
βββ src/
β βββ config/ β μ¬κΈ°μ logger.py μμ±
β βββ db/
β βββ models/
β βββ ...
βββ tests/
βββ README.md
2. logger.py ν΅μ¬ μ½λ
import logging
def setup_logging() -> None:
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
handlers=[
logging.StreamHandler(),
logging.FileHandler("app.log", "a", "utf-8"),
],
)
3. ν
μ€νΈ μ½λ μμ± λ° μ€ν
- νμΌ:
test_logging.py
- ν
μ€νΈ λ΄μ©:
- λͺ¨λ λ‘κΉ
λ 벨 ν
μ€νΈ
- λ€μν λͺ¨λλ³ λ‘κΉ
ν
μ€νΈ
- μ½μκ³Ό νμΌ λμ μΆλ ₯ νμΈ
β
ν
μ€νΈ κ²°κ³Ό λΆμ
μ±κ³΅μ μΈ λμ νμΈ
- DEBUG νν°λ§ β
- INFO λ 벨 μ€μ μΌλ‘ DEBUG λ©μμ§ μ°¨λ¨
- λ‘κ±° μ΄λ¦ κ΅¬λΆ β
-
__main__, database, openai_api λ± λͺ¨λλ³ κ΅¬λΆ
- μκ° μ νμ± β
- λ°λ¦¬μ΄ λ¨μ μ νν νμμ€ν¬ν
- λμ μΆλ ₯ β
- μ½μκ³Ό νμΌμ λμΌν λ΄μ© κΈ°λ‘
- Append λͺ¨λ β
- μ¬λ¬ λ² μ€νν΄λ λ‘κ·Έ λμ μ μ₯
- UTF-8 μΈμ½λ© β
- νκΈ κΉ¨μ§ μμ΄ μλ²½ μ μ₯
μ€μ ν
μ€νΈ μΆλ ₯ μμ
2025-08-02 01:06:51,021 [INFO] __main__: βΉοΈ νλ‘κ·Έλ¨μ΄ μ μμ μΌλ‘ μμλμμ΅λλ€
2025-08-02 01:06:51,021 [WARNING] __main__: β οΈ μ΄κ²μ κ²½κ³ λ©μμ§μ
λλ€
2025-08-02 01:06:51,021 [ERROR] __main__: β μλ¬κ° λ°μνμ΅λλ€
2025-08-02 01:06:51,021 [INFO] database: πΎ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ±κ³΅
π κΈ°μ‘΄ insupanda-ragμ λΉκ΅
곡ν΅μ (μ λ°λΌν λΆλΆ)
- β
λμΌν λ‘κΉ
λ 벨 (INFO)
- β
λμΌν ν¬λ§· ꡬ쑰
- β
λμΌν νΈλ€λ¬ μ‘°ν©
- β
λμΌν νμΌ μ€μ
μ°λ¦¬ λ²μ μ μ₯μ
- μμΈν μ£Όμ: κ° λΌμΈμ λͺ©μ κ³Ό λμ μ리 λͺ
νν μ€λͺ
- ꡬ쑰νλ μ½λ:
setup_logging() ν¨μλ‘ κΉλνκ² μ 리
- νμ΅ μΉνμ : μ΄λ³΄μλ μ΄ν΄ν μ μλ μμΈν μ€λͺ
π― ν΅μ¬ νμ΅ ν¬μΈνΈ
1. λ‘κΉ
μμ€ν
μ 3κ°μ§ ν΅μ¬ κΈ°λ₯
- μ½μ μΆλ ₯: μ€μκ° λͺ¨λν°λ§
- νμΌ μ μ₯: μꡬ λ³΄κ΄ λ° λΆμ
- λ 벨 νν°λ§: νμν μ λ³΄λ§ μ λ³ κΈ°λ‘
2. Append λͺ¨λμ μ€μμ±
- "a" λͺ¨λ: κΈ°μ‘΄ λ‘κ·Έ 보쑴νλ©° μ λ‘κ·Έ μΆκ°
- "w" λͺ¨λ: κΈ°μ‘΄ λ‘κ·Έ μμ ν μλ‘ μμ± (μν!)
- μ€μ μ¦λͺ
: λ λ² μ€ννμ λ λͺ¨λ λ‘κ·Έκ° λμ μ μ₯λ¨
3. λ‘κ±° μ΄λ¦(%(name)s)μ κ°μΉ
- λ¬Έμ μΆμ : μ΄λ λͺ¨λμμ λ°μν λ‘κ·ΈμΈμ§ μ¦μ μλ³
- λλ²κΉ
ν¨μ¨μ±: μλ¬ λ°μ μ ν΄λΉ λΆλΆλ§ μ§μ€ λΆμ κ°λ₯
- μμ€ν
λͺ¨λν°λ§: κ° κ΅¬μ± μμλ³ μν κ°λ³ νμΈ
π λ€μ λ¨κ³ μκ³
λ€μ μΈμ
μμλ νκ²½ λ³μμ μ€μ κ΄λ¦¬λ₯Ό λ€λ£° μμ μ
λλ€:
- Pydanticμ νμ©ν μ€μ κ΄λ¦¬
- νκ²½λ³μ(.env) νμ©λ²
- κ°λ°/μ΄μ νκ²½ λΆλ¦¬ λ°©λ²
π νμ΅ μ±κ³Ό
- β
λ‘κΉ
μ ν΅μ¬ κ°λ
μμ μ΄ν΄
- β
Python logging λΌμ΄λΈλ¬λ¦¬ μ€μ΅ μλ£
- β
μ½μ/νμΌ λμ μΆλ ₯ μμ€ν
ꡬμΆ
- β
κΈ°μ‘΄ νλ‘μ νΈ μ½λμ λΉκ΅ λΆμ μλ£
- β
μ€λ¬΄μμ μ¬μ©ν μ μλ λ‘κΉ
μμ€ν
μ΅λ