homeblog

[셀프 모니터링 #1] 프롬프트를 기록해보기로 했다

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

왜 JSONL인가

JSON 배열이 아니라 한 줄에 하나의 JSON 객체를 쓰는 방식이다.

JSONL을 사용하는 핵심 이유는 세 가지다:

  1. 스트리밍 처리가 가능하다. 파일 전체를 메모리에 올리지 않고 한 줄씩 읽고 처리할 수 있다. 수십 GB 데이터도 메모리 걱정 없이 순차 처리할 수 있다는 게 가장 큰 장점이다.
  2. Append가 간단하다. 파일 끝에 한 줄만 추가하면 된다. JSON 배열처럼 전체 구조를 다시 쓸 필요가 없으니, 로그처럼 데이터가 계속 쌓이는 시나리오에 적합하다.
  3. 각 줄이 독립적이다. 한 줄이 깨져도 나머지 줄에는 영향이 없다. 파싱 에러 복구가 쉽고, 부분 처리나 병렬 처리(파일을 줄 단위로 분할)에도 유리하다.

결국 JSONL의 핵심은 "대량 데이터를 순차적으로 쓰고, 한 줄씩 독립적으로 읽는 것"이다. 이 패턴에 해당하지 않는다면 굳이 JSONL을 선택할 이유는 없다. 프롬프트 로깅은 정확히 이 패턴이라 JSONL로 갔다.

어떤 필드를 저장할까

이 로그는 결국 /analyze-prompts 같은 slash command에서 Agent가 읽고 분석하게 된다. 한 레코드에 정보를 너무 많이 넣으면 Agent가 핵심을 놓치거나 불필요한 필드에 주의를 뺏길 수 있다. 그래서 필수 정보만 저장하고, 부가 정보는 필수 정보로부터 분석 시점에 계산하도록 했다.

저장하기로 한 필드들:

  • timestamp — ISO 8601 로컬 시간. 시간대 패턴 분석용
  • session_id — 세션 식별자. transcript 파일과 연결하면 그 세션에서 어떤 대화를 나눴는지 추적 가능
  • transcript_path — 세션 전체 대화 기록 파일 경로
  • cwd — 작업 디렉토리. 어느 프로젝트에서 입력했는지
  • prompt — 프롬프트 전문
  • category — 키워드 기반 자동 분류 (general, debugging, testing, git-ops, slash-command 등)
  • permission_mode — 권한 모드
  • slash_command — /로 시작하는 명령어일 때만 기록

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로그 저장 위치

아직 데이터가 하루치밖에 없다. 좀 더 쌓이면 진짜 반복 패턴이 보일 것 같다. 다음 글에서는 실제로 분석해보고 뭘 자동화했는지 기록할 예정이다.

503 Service Unavailable 이슈 요약

발생 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 재시작, 배포 중 롤링 업데이트, 순간적 리소스 초과 등이 원인일 수 있음.

대응:

  • 재요청 시 200이 오면 일시적 이슈로 판단
  • 반복 발생 시 인프라 팀에 Pod 상태 및 Linkerd 대시보드 확인 요청
  • 클라이언트 코드에 503 대상 재시도 로직(exponential backoff) 적용 권장