ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿ Flask Python Structured Logging โ€” What Most Miss in Production
Dev.toDev.to
Backend

๋น„์ •ํ˜• ํ…์ŠคํŠธ ๋กœ๊ทธ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•œ JSON ๊ธฐ๋ฐ˜ Structured Logging ์ฒด๊ณ„ ๊ตฌ์ถ•

๐Ÿ Flask Python Structured Logging โ€” What Most Miss in Production

Python-T Point2026๋…„ 5์›” 24์ผ9๋ถ„intermediate

Context

๋Œ€๋‹ค์ˆ˜ Flask ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด plain text ํ˜•ํƒœ์˜ ๋น„์ •ํ˜• ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊น… ์ง€์—ฐ ๋ฐ ํ•„ํ„ฐ๋ง ์‹ ๋ขฐ๋„ ์ €ํ•˜ ๋ฌธ์ œ ๋ฐœ์ƒ. Datadog, Loki ๋“ฑ ํ˜„๋Œ€์  ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๋„์ž… ํ›„์—๋„ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ™” ๋ถ€์žฌ๋กœ ์ธํ•œ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์˜ ๋ถˆ์•ˆ์ •์„ฑ ์ง€์†.

Technical Solution

  • LogRecord ๊ฐ์ฒด์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฒฐ์ •์  Serialization์ด ๊ฐ€๋Šฅํ•œ JsonFormatter ์„ค๊ณ„
  • Loguru์˜ Sink ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ ๋ชฉ์ ์ง€๋ณ„ ๊ฐœ๋ณ„ ํฌ๋งทํŒ… ๋ฐ ํ•„ํ„ฐ๋ง ๋กœ์ง ๋ถ„๋ฆฌ
  • contextvars ๊ธฐ๋ฐ˜์˜ Context Propagation์„ ์ ์šฉํ•˜์—ฌ Request-scoped ๋ฐ์ดํ„ฐ์˜ ์ž๋™ ์ „ํŒŒ ๊ตฌํ˜„
  • logger.bind()๋ฅผ ํ†ตํ•œ ์ปจํ…์ŠคํŠธ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋ฐ˜๋ณต์ ์ธ extra ์ธ์ž ์ „๋‹ฌ ์ œ๊ฑฐ ๋ฐ ์ฝ”๋“œ ๋ณต์žก๋„ ๊ฐ์†Œ
  • JSON Serialization ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด high-throughput ํ™˜๊ฒฝ์—์„œ orjson ๋„์ž… ๊ณ ๋ ค
  • Middleware Injection์„ ํ†ตํ•œ ์š”์ฒญ ์ฃผ๊ธฐ ์ „์ฒด์˜ ์ผ๊ด€๋œ ๊ตฌ์กฐ์  ๋กœ๊ทธ ์บก์ฒ˜ ์ฒด๊ณ„ ๋งˆ๋ จ

1. ํ‘œ์ค€ logging ๋ชจ๋“ˆ๊ณผ Loguru ์ค‘ ํŒ€ ์ˆ™๋ จ๋„ ๋ฐ ์˜์กด์„ฑ ์ œ์•ฝ์— ๋”ฐ๋ผ ๋‹จ์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ

2. trace ID, user ID ๋“ฑ ์š”์ฒญ ๋ฒ”์œ„ ๋ฐ์ดํ„ฐ๋ฅผ contextvars์— ์ €์žฅํ•˜์—ฌ ๋กœ๊ทธ ์ „๋ฐ˜์— ์ž๋™ ํฌํ•จ

3. ๋‹จ์ˆœ ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์—์„œ JSON ๊ธฐ๋ฐ˜์˜ Queryable ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜

4. ๋กœ๊ทธ ๋กœํ…Œ์ด์…˜ ์„ค์ • ์‹œ Filebeat ๋“ฑ Log Shipper์™€์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€์ฆ

5. ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ตฌ๊ฐ„์—์„œ sampling ์ „๋žต ๋˜๋Š” ๊ณ ์„ฑ๋Šฅ JSON ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€ํ† 

์›๋ฌธ ์ฝ๊ธฐ