Mar 31, 2026
1 views
Claude Code를 쓰다 보니 문득 궁금해졌다. 나는 매일 어떤 프롬프트를 치고 있을까?
비슷한 말을 반복하고 있는 것 같은데, 정확히 뭘 얼마나 반복하는지는 모른다. 일단 기록부터 해보기로 했다.
Claude Code에는 UserPromptSubmit이라는 훅이 있다. 프롬프트를 입력할 때마다 실행되는 이벤트인데, 여기에 스크립트를 걸면 모든 입력을 자동으로 기록할 수 있다.
그래서 만든 게 ~/.claude/hooks/log-prompt.sh. stdin에서 훅 데이터를 읽고, JSONL 형식으로 파일에 append 한다.
리포별, 날짜별로 나눴다.
~/.claude/prompt-logs/
├── course-frontend/
│ └── 2026-03-31.jsonl
└── account-frontend/
└── 2026-03-31.jsonl
JSON 배열이 아니라 한 줄에 하나의 JSON 객체를 쓰는 방식이다.
JSONL을 사용하는 핵심 이유는 세 가지다:
결국 JSONL의 핵심은 "대량 데이터를 순차적으로 쓰고, 한 줄씩 독립적으로 읽는 것"이다. 이 패턴에 해당하지 않는다면 굳이 JSONL을 선택할 이유는 없다. 프롬프트 로깅은 정확히 이 패턴이라 JSONL로 갔다.
이 로그는 결국 /analyze-prompts 같은 slash command에서 Agent가 읽고 분석하게 된다. 한 레코드에 정보를 너무 많이 넣으면 Agent가 핵심을 놓치거나 불필요한 필드에 주의를 뺏길 수 있다. 그래서 필수 정보만 저장하고, 부가 정보는 필수 정보로부터 분석 시점에 계산하도록 했다.
저장하기로 한 필드들:
/로 시작하는 명령어일 때만 기록local_hour나 prompt_length 같은 건 timestamp와 prompt에서 바로 계산할 수 있으니 뺐다.
로그를 분석하는 /analyze-prompts 전역 slash command도 만들었다. 몇 번 써보니 사용성이 괜찮다. 추후 스케줄로 자동 실행해볼까 생각 중이다.
| 파일 | 역할 |
|---|---|
~/.claude/hooks/log-prompt.sh | 프롬프트 자동 로깅 |
~/.claude/commands/analyze-prompts.md | 로그 분석 slash command |
~/.claude/prompt-logs/{리포}/{날짜}.jsonl | 로그 저장 위치 |
아직 데이터가 하루치밖에 없다. 좀 더 쌓이면 진짜 반복 패턴이 보일 것 같다. 다음 글에서는 실제로 분석해보고 뭘 자동화했는지 기록할 예정이다.
발생 API: GET /client/api/v1/course/339923?lang=ko (course-api.devinflearn.com)
발생 시간: 2026-03-31 08:14:16 GMT
원인: Linkerd 서비스 메시의 fail-fast 메커니즘이 작동하여 503을 반환함
근거 헤더:
l5d-proxy-error: service in fail-fast → 백엔드 Pod이 요청을 받을 수 없는 상태l5d-proxy-connection: close → 연결 즉시 종료content-length: 0 → 애플리케이션 응답이 아닌 프록시 레벨 차단요청 경로:
클라이언트 (localhost:3000) → CloudFront → Linkerd 프록시 (여기서 차단 ❌) → course-api (도달 못함)
판단: 서버 응답 16ms로 매우 빨랐고, Linkerd가 즉시 차단한 것이므로 일시적 이슈일 가능성이 높음. Pod 재시작, 배포 중 롤링 업데이트, 순간적 리소스 초과 등이 원인일 수 있음.
대응: