로그 붙여넣기의 절반은 낭비다 — UUID·타임스탬프 토큰 실측
에러가 나면 로그를 통째로 복사해 AI에 붙여 넣게 됩니다. 그런데 그 로그의 절반 이상이 AI가 읽을 필요 없는 문자열입니다.
서버 로그 7줄을 놓고 어느 부분이 토큰을 먹는지 하나씩 지워가며 재봤습니다. 결과는 꽤 극단적이었습니다.
결론부터
| 처리 | 토큰 | 원본 대비 |
|---|---|---|
| 원본 그대로 | 489 | 100% |
| 타임스탬프만 제거 | 383 | 78% |
| req_id(UUID)만 제거 | 254 | 52% |
| 둘 다 제거 | 148 | 30% |
| 둘 다 제거 + 반복 줄 합치기 | 112 | 23% |
UUID 하나가 로그 전체 토큰의 48%를 먹습니다. 타임스탬프까지 지우면 70%가 사라지는데, 진단에 필요한 정보는 그대로 남습니다.
왜 UUID가 그렇게 비싼가
문제의 한 줄을 보겠습니다.
2026-09-18T04:12:34.556Z [ERROR] req_id=a4d9b371-2e65-4c08-9b7f-5a3d1e8c6f02 svc=payment-worker msg="connection reset by peer" retry=1사람 눈에는 req_id= 뒤가 그냥 긴 문자열 하나입니다. 그런데 토크나이저에게는 의미 없는 글자와 하이픈의 나열이라 묶을 수 있는 덩어리가 없습니다. 결국 거의 글자 단위로 쪼개집니다.
| 부분 | 성격 | 토큰 효율 |
|---|---|---|
svc=payment-worker | 흔한 영어 단어 | 좋음 |
connection reset by peer | 흔한 문장 | 좋음 |
a4d9b371-2e65-4c08-... | 무작위 16진수 | 최악 |
2026-09-18T04:12:34.556Z | 숫자·기호 혼합 | 나쁨 |
무작위 문자열은 토크나이저가 가장 싫어하는 입력입니다. 그리고 로그는 그런 문자열을 줄마다 반복해서 담고 있습니다.
그런데 지워도 되는가
여기가 중요합니다. 비용을 줄이려다 진단에 필요한 정보를 버리면 의미가 없습니다.
| 항목 | 지워도 되나 | 이유 |
|---|---|---|
| 타임스탬프(날짜 부분) | 대개 지워도 됨 | 같은 날 로그라면 날짜는 모든 줄에 동일 |
| 타임스탬프(시:분:초) | 남기세요 | 순서와 간격이 원인 추적의 핵심 |
| req_id 전체 | 상황에 따라 | 여러 요청이 섞였다면 필요 |
| req_id 앞 8자리 | 좋은 절충 | 구분은 되면서 토큰은 35% 절약 |
| 반복되는 재시도 줄 | 합치세요 | “3회 재시도” 한 줄이면 충분 |
req_id를 남겨야 한다면 앞 8자리만
여러 요청이 뒤섞인 로그라면 요청을 구분할 식별자가 필요합니다. 그럴 때 UUID 전체가 아니라 앞 8자리만 남기면 317토큰(65%)이 됩니다. 구분은 그대로 되면서 3분의 1이 절약됩니다.
스택트레이스는 더 심합니다
파이썬 스택트레이스 하나를 재봤습니다. 원본 195토큰 중 대부분이 내 코드가 아닌 라이브러리 내부 경로였습니다.
| 처리 | 토큰 | 원본 대비 |
|---|---|---|
| 원본 그대로 | 195 | 100% |
| 라이브러리 프레임 제거 | 136 | 70% |
| 마지막 4줄만 | 54 | 28% |
/usr/local/lib/python3.11/site-packages/... 같은 줄은 길기만 하고 원인 파악에 거의 기여하지 않습니다. 대개 마지막 몇 줄에 답이 있습니다.
스택트레이스는 아래에서부터 읽으세요. 그리고 아래 4~5줄만 붙여 넣으세요. 부족하면 그때 더 주면 됩니다.
실제 규모로 보면
로그 1,000줄을 붙여 넣는 상황을 환산했습니다.
| 처리 | 약 토큰 |
|---|---|
| 원본 그대로 | 69,857 |
| 타임스탬프·req_id 제거 | 21,142 |
| 차이 | 48,715 절약 |
한 번이면 별것 아닐 수 있지만, 장애 대응 중에는 로그를 여러 번 반복해서 붙여 넣게 됩니다. 게다가 대화가 길어지면 앞서 넣은 로그가 매 턴 다시 전송됩니다 — 이 부분은 대화 누적 비용을 다룬 글에서 따로 측정했습니다.
실전 권장안
- 날짜는 빼고 시:분:초만 남기세요. 순서 정보는 그대로 유지됩니다.
- UUID는 앞 8자리로 줄이세요. 구분은 되고 비용은 3분의 1 줄어듭니다.
- 반복 줄은 합치세요. “같은 에러 3회” 한 줄이면 됩니다.
- 스택트레이스는 마지막 4~5줄만. 라이브러리 내부 경로는 대개 불필요합니다.
- 관련 없는 서비스의 로그는 빼세요. 가장 확실한 절약입니다.
정리하면 로그는 그대로 붙여 넣는 것이 가장 비싼 방법입니다. 30초만 들여 다듬으면 비용이 3분의 1이 되고, 오히려 AI가 핵심을 더 잘 짚습니다. 불필요한 문자열이 줄어들면 신호 대비 잡음이 낮아지기 때문입니다.
재현 코드
import re, tiktoken
enc = tiktoken.get_encoding("o200k_base")
n = lambda t: len(enc.encode(t))
log = open("app.log", encoding="utf-8").read()
# 타임스탬프와 UUID 제거
clean = re.sub(r"^\d{4}-\d{2}-\d{2}T[\d:.]+Z\s*", "", log, flags=re.M)
clean = re.sub(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-"
r"[0-9a-f]{4}-[0-9a-f]{12}", "", clean)
print("원본 ", n(log))
print("정리 후", n(clean))
print("절감 ", "%.0f%%" % ((1 - n(clean)/n(log)) * 100))한계: 측정에 쓴 로그는 구조화된 형식(key=value)의 서버 로그 7줄입니다. JSON 로그는 따옴표와 중괄호 때문에 더 비싸고, 평문 로그는 더 쌉니다. 또 절감률은 로그에 UUID가 얼마나 들어 있느냐에 크게 좌우됩니다 — 식별자가 없는 로그라면 절감 폭이 훨씬 작습니다. 중요한 것은 배수가 아니라 ‘무작위 문자열이 비싸다’는 원리입니다.
정리
- 로그에서 UUID 하나가 전체 토큰의 48%를 차지했습니다.
- 타임스탬프까지 지우면 30%, 반복 줄까지 합치면 23%가 됩니다.
- 무작위 문자열은 토크나이저가 묶을 수 없어 글자 단위로 쪼개집니다.
- 스택트레이스는 마지막 4줄만 쓰면 28% — 진단력은 거의 그대로입니다.
- 로그 1,000줄 기준 약 48,700토큰 차이가 납니다.
측정일: 2026년 9월 22일 / tiktoken 0.14.0 / 인코딩 o200k_base