로그 읽는 법
로그는 워커와 세션이 자기가 한 일을 시각과 함께 한 줄씩 적어 둔 파일입니다. 셋이 있고, 무엇이 궁금한지에 따라 여는 파일이 다릅니다.
<루트>/workers/runner.log 디스패치 기록
<루트>/workers/logs/<시각>-<워커>-<해시>.log 세션별 실제 출력
<루트>/workers/cron.log cron 자체의 리다이렉트runner.log — 디스패치 기록
워커가 tick마다 무엇을 했는지 여기 남깁니다. 형식은 <시각> [<워커이름>] <메시지>이고,
메시지는 접두어로 갈립니다.
| 접두어 | 언제 | 뜻 |
|---|---|---|
DISPATCH | 티켓을 잡아 세션을 띄운 순간 | kind·persona·sid·세션 로그 파일명을 같이 적는다 |
DONE | 세션이 정상 종료 | 실제 session_id를 적는다 |
FAIL | 세션이 오류로 끝남 | rc≠0 또는 응답의 is_error |
TIMEOUT | TICKET_MAXRUN 초과로 강제종료 | rc가 143/137일 때 |
STALL | 엔진이 최초 프롬프트를 못 받음 | TICKET_FEED_TIMEOUT 초과 |
NOTE | 세션키 정정 | 응답의 실제 session_id가 사전 발급값과 다를 때 |
SKIP | 이번 tick을 건너뜀 | 같은 워커가 앞 세션을 아직 쥐고 있을 때, 또는 claude 헤드리스 후보에 인증 토큰이 없을 때(메시지가 SKIP AUTH 대기 ...로 시작하며 최초 1회만 남긴다) |
WARN | 정지시키지 않는 이상 상황 | 스테일 락 회수·컨텍스트 경로 없음·페르소나 프로필 없음 등 |
ERROR | 디스패치 준비 단계에서 실패 | 네 지점 중 하나 — select 실패·assign 실패·작업 디렉터리(TICKET_CWD) 없음·mkfifo 실패 |
REAP / REAP-FAIL | 스테일 티켓을 백로그로 회수(또는 회수 실패) | 매 tick 맨 앞 |
ASK | 답변 요청으로 전환 | 자동 회수 3회째, 또는 세션이 ## 블록을 남기고 멈췄으면 횟수와 무관하게 즉시. 본문에 ## 질문 n이 붙는다 |
SUSPECT | 손 클레임 세션이 유휴로 의심됨(보고만) | 자동 회수하지 않는다 |
UNASSIGN / UNASSIGN-DENY | 할당 해제 성공(또는 산 세션이라 거부) | unassign 명령 |
"아무 일도 안 일어나는 것 같다"의 첫 확인 자리가 여기입니다. DISPATCH가 안 찍혔다면
디스패치 자체가 안 된 것이고(선정 실패·인증 대기 등), DISPATCH 뒤에 DONE도 FAIL도
없다면 세션이 아직 도는 중입니다.
logs/<시각>-<워커>-<해시>.log — 세션별 실제 출력
runner.log가 "언제 어떤 티켓을 물었나"라면 이 파일은 "그 세션 안에서 무슨 일이
있었나"입니다. 엔진의 표준에러와 최종 표준출력이 여기 쌓입니다. 기본 엔진(claude -p,
스트리밍 입력)에서는 JSONL 한 줄이 곧 한 이벤트고, 마지막 "type":"result" 줄이 그 세션의
최종 판정입니다(FAIL/DONE 판정의 근거).
FAIL이나 TIMEOUT이 runner.log에 찍혔을 때 왜 실패했는지는 이 파일에서만 보입니다.
runner.log는 판정 결과만 적고, 세션이 실제로 무엇을 읽고 무엇을 시도하다 막혔는지는 여기
담깁니다.
도는 동안에는 이 파일이 비어 있습니다. 워커가 엔진 출력을 따로 받아 두었다가 세션이 끝난 뒤 한 번에 붓기 때문입니다. 진행중인 세션을 실시간으로 보시려면 티켓 상세의 세션 스트림을 여세요. 그 화면이 읽는 것은 이 파일이 아니라 트랜스크립트, 그러니까 Claude Code가 자기 세션이 주고받은 말과 도구 호출을 순서대로 적어 두는 기록 파일입니다(화면에서 보는 것 §세션 스트림).
cron.log — 워커 스크립트 자체의 출력
crontab 줄이 리다이렉트하는 대상입니다(>> .../cron.log 2>&1). 여기 쌓이는 것은 워커 셸
스크립트 자체의 표준출력·표준에러이지 세션의 출력이 아닙니다. 정상 동작 중에는 대개 비어
있습니다. tick.sh가 하는 일은 전부 runner.log에 따로 적으니까요. 이 파일에 뭔가 있다면
bash 자체가 실행되지 못했거나(권한, 셔뱅 오류) tick.sh가 시작하기도 전에 죽은 것입니다.
증상별 확인 순서
- 아무 일도 안 일어난 것 같다 →
runner.log부터 보세요.DISPATCH가 있는지, 있다면 그 뒤에DONE/FAIL/TIMEOUT이 붙었는지 봅니다. runner.log조차 갱신되지 않는다 →cron.log를 보세요. 워커 자체가 안 뜬 것입니다 (마운트 문제는 트러블슈팅 §워커가 아예 안 뜬다 참고).FAIL/TIMEOUT은 찍혔는데 이유를 알아야 한다 → 그 줄의log=파일명으로logs/의 세션별 로그를 여세요.
다음은 사용 통계와 끄는 법입니다.