๐ŸŒŠ Logtide 0.5.0: Observability๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

๋ฐœํ–‰: (2026๋…„ 1์›” 31์ผ ์˜คํ›„ 10:29 GMT+9)
6 min read
์›๋ฌธ: Dev.to

Source: Dev.to

์œ„์˜ ๋งํฌ์— ์žˆ๋Š” ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๋ฉด, ํ•ด๋‹น ๋‚ด์šฉ์„ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก, URL ๋ฐ ๊ธฐ์ˆ  ์šฉ์–ด๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋‚ด์šฉ๋งŒ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐœ์š”

Logtideโ€ฏ0.5.0์€ ๋กœ๊ทธ ๋ถ„์„์„ ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด์„œ ๋ฐฐํฌ๋ฅผ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ Redis์˜ ์ „์ฒด ๊ธฐ๋Šฅ์ด๋‚˜ ์ตœ์†Œํ•œ์˜ PostgreSQLโ€‘์ „์šฉ ์„ค์ • ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด๊ธฐ

ํ…Œ์ด๋ธ” โ†” ํ„ฐ๋ฏธ๋„ ์ „ํ™˜

๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—์„œ Table๊ณผ Terminal ๋ณด๊ธฐ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„ ๋ชจ๋“œ๋Š” ๋กœ๊ทธ๋ฅผ ๊ณ ์ „์ ์ธ ๊ณ ์ •ํญ ์Šคํƒ€์ผ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ANSIโ€‘์Šคํƒ€์ผ ์ƒ‰์ƒ ์ฝ”๋”ฉ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค:

[2025-01-31T14:23:45.123Z] [ERROR] [api-gateway] Database connection timeout
[2025-01-31T14:23:46.456Z] [WARN]  [auth-service] Rate limit approaching threshold
[2025-01-31T14:23:47.789Z] [INFO]  [web-server]   Request completed in 45ms

์ด ์„ค์ •์€ ์„ธ์…˜ ๊ฐ„์— ์ง€์†๋˜๋ฉฐ Live Tail๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํƒ์ง€ ํŒฉ

๋ณด์•ˆ ์•Œ๋ฆผ์€ ์ด์ œ Sigma ๊ทœ์น™์— ๋Œ€ํ•œ ๊นŠ์€ ์ง€์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐค๋Ÿฌ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ํŒฉ์„ ์„ ํƒํ•˜์„ธ์š”(์˜ˆ: ์›น ๊ณต๊ฒฉ, ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ์‹œ๋„, ์˜์‹ฌ์Šค๋Ÿฌ์šด ํ–‰๋™ ํŒจํ„ด ๋“ฑ) ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํŒฉ์€ logsource.product: any๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด‘๋ฒ”์œ„ํ•œ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒ€์ฆ๋œ Sigma ๊ทœ์น™์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ทœ์น™์€ ์™„์ „ํžˆ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๊ตฌ์„ฑ๋ณด๋‹ค ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋™ ์ƒ๊ด€๊ด€๊ณ„

Logtide๋Š” ์ด์ œ ๋กœ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ request_id, trace_id, user_id์™€ ๊ฐ™์€ ์‹๋ณ„์ž ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ƒ๊ด€ ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์‹๋ณ„์ž๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋“  ์„œ๋น„์Šค์— ๊ฑธ์นœ ๊ด€๋ จ ์ด๋ฒคํŠธ๊ฐ€ ์ฆ‰์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹คโ€”์ „์šฉ ์ถ”์  ์ธํ”„๋ผ๊ฐ€ ํ•„์š” ์—†๋Š” ๋ถ„์‚ฐ ์ถ”์ .

์•Œ๋ฆผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

์•Œ๋ฆผ ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์—, ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธํ•˜์‹ญ์‹œ์˜ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋กœ๊ทธ๊ฐ€ ์‹ค์ œ๋กœ ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ–ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ์ž„๊ณ„๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ณ  ์˜คํƒ์ง€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redis ์„ ํƒ ์‚ฌํ•ญ

Redis๋Š” ์ด์ œ ์™„์ „ํžˆ ์„ ํƒ ์‚ฌํ•ญ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. REDIS_URL์ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด Logtide๋Š” PostgreSQL ๊ธฐ๋ฐ˜ ๋Œ€์ฒด ์˜ต์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

๊ธฐ๋ŠฅRedis ๊ตฌํ˜„PostgreSQL ๋Œ€์ฒด
JobsBullMQgraphile-worker
Live TailRedis pub/subPostgreSQL LISTEN/NOTIFY
Rate limitingRedisโ€‘backedInโ€‘memory
CachingRedis cacheDisabled (queries hit DB directly)

์ƒˆ๋กœ์šด docker-compose.simple.yml์€ PostgreSQL๊ณผ Logtide๋งŒ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹คโ€”๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ํ˜น์€ ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ํ”„๋กœ๋•์…˜ ์ž‘์—…์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด Redis ๊ธฐ๋ฐ˜ ๋ฐฐํฌ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ •

๋ณด์•ˆ ๊ฐ•ํ™”

  • ์ธ์ ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ •๊ทœ์‹ ๊ฒ€์ฆ ๊ฐ•ํ™”
  • ์ถ”๊ฐ€ ๋ผ์šฐํŠธ์— ๋Œ€ํ•œ ์†๋„ ์ œํ•œ ํ™•๋Œ€
  • ์•Œ๋ฆผ ํผ๋ธ”๋ฆฌ์…”์˜ SQLโ€‘์ธ์ ์…˜ ์ทจ์•ฝ์  ์ˆ˜์ •(์ด์ œ ์ ์ ˆํ•œ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋œ ์ฟผ๋ฆฌ ์‚ฌ์šฉ)

๋ฒ„๊ทธ ์ˆ˜์ •

  • URL ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹ซ์€ ํ›„ ๋กœ๊ทธ ์ปจํ…์ŠคํŠธ ๋ชจ๋‹ฌ์ด ๋‹ค์‹œ ์—ด๋ฆฌ์ง€ ์•Š์Œ
  • ๋ผ์ด๋ธŒโ€‘ํ…Œ์ผ ํ•ธ๋“ค๋Ÿฌ์—์„œ WebSocket ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ˆ˜์ •
  • ์˜ˆ์™ธ ์ƒ์„ธ ์ •๋ณด๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„๋“œ์—์„œ ์˜ค๋ฅ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”์ถœํ•˜๋„๋ก ์ˆ˜์ •

UX ๊ฐœ์„ 

  • ์˜ˆ์™ธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์— ์ปจํ…์ŠคํŠธ ํ•„๋“œ(env, service, version, hostname) ํฌํ•จ
  • ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ๋ณต์‚ฌ ๋ฒ„ํŠผ
  • ์˜ค๋ฅ˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ํฌ๋งท ๊ฐœ์„ 

์—…๊ทธ๋ ˆ์ด๋“œ ์•ˆ๋‚ด

Redis ์‚ฌ์šฉ ํ‘œ์ค€ ์—…๊ทธ๋ ˆ์ด๋“œ

docker compose pull
docker compose up -d

Redis ์—†์ด ๋ฐฐํฌ ์ „ํ™˜

docker compose -f docker-compose.simple.yml pull
docker compose -f docker-compose.simple.yml up -d

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋‚˜ ์ค‘๋‹จ๋˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๊ธฐ๋Šฅ

  • Rateโ€‘ofโ€‘change alerts: ์ •์  ์ž„๊ณ„๊ฐ’์ด ์•„๋‹ˆ๋ผ ์ด์ƒ ์ง•ํ›„์— ๋”ฐ๋ผ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ํ†ต๊ณ„์  ๊ธฐ์ค€์„ 
  • Advanced correlation: ์ „์ฒด ์Šคํƒ์— ๊ฑธ์นœ ์š”์ฒญ ํ๋ฆ„์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋‹ค์ค‘ ํ™‰ ์ด๋ฒคํŠธ ๊ทธ๋ž˜ํ”„
  • Enhanced PII masking: GDPRโ€‘์ค€์ˆ˜ ์ž๋™ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์‚ญ์ œ

Logtide ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

  • ํด๋ผ์šฐ๋“œ:
  • ์…€ํ”„โ€‘ํ˜ธ์ŠคํŒ…:
  • ๋ฌธ์„œ:

์ „์ฒด ๋ณ€๊ฒฝ ๋กœ๊ทธ: v0.4.2โ€ฆv0.5.0

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Redis ์„ค๋ช…: ๋ฌด์—‡์ด๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋“ค

์†Œ๊ฐœ ๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๋“ค์ด Redis์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด, ์™œ ์ด๋ ‡๊ฒŒ ํฐ ํ™”์ œ์ธ์ง€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Redis๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, ์บ์‹ฑ, ์‹ค์‹œ๊ฐ„ โ€ฆ

AI ์‹œ๋Œ€์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์—์„œ ๋ฐฑ์—”๋“œ ๋งˆ์Šคํ„ฐ๋ฆฌ: (2026 ์—๋””์…˜)

์†Œ๊ฐœ ์˜ค๋Š˜๋‚  ๊ธ‰์†ํžˆ ๋ณ€ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—ดํ’ ์†์—์„œ โ€” ์ผ์ฃผ์ผ์€ Express, ๋‹ค์Œ ์ฃผ๋Š” NestJS, ๊ทธ ๋‹ค์Œ์€ Gin, FastAPI, ํ˜น์€ Spring Boot โ€” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด API๋ฅผ ...