๋น์ ํ ํ ์คํธ ๋ก๊ทธ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ JSON ๊ธฐ๋ฐ Structured Logging ์ฒด๊ณ ๊ตฌ์ถ
๐ Flask Python Structured Logging โ What Most Miss in Production
AI ์์ฝ
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 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒํ