로그 스트리밍
실행 중인 잡의 로그를 offset 폴링으로 따라가는 방법, CLI와 MCP와 콘솔의 로그 보기, 로그 크기 한도를 설명합니다
로그는 GET /v1/jobs/{job_id}/logs를 offset과 함께 반복해서 부르는 방식으로 실시간에 가깝게 읽고, CLI는 이 폴링을 대신해 줍니다
API로 따라가기
curl -s "https://xenoci.com/api/runner/v1/jobs/job_7Kp2QmX9bT4vR1sLwZ3n/logs?offset=0" \
-H "Authorization: Bearer $XENOCI_API_KEY" -D -HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
X-Log-Next-Offset: 4096
X-Log-Complete: false
X-Request-Id: req_…
[xenoci] 업로드 반영 1.2초
Command line invocation:
/Applications/Xcode_27.0.app/Contents/Developer/usr/bin/xcodebuild -scheme App ...| 헤더 | 뜻 |
|---|---|
X-Log-Next-Offset | 다음 호출에 넣을 offset (바이트) |
X-Log-Complete | true면 잡이 끝났고 더 쌓일 로그가 없음 |
폴링 순서는 다음과 같습니다
offset=0으로 시작해 본문을 출력합니다X-Log-Next-Offset을 다음offset으로 씁니다X-Log-Complete가false면 2초쯤 기다렸다가 반복합니다true가 되면 잡을 한 번 더 읽어status,exit_code,billed_minutes를 확인합니다
셸로 쓰면 이렇습니다
JOB=job_7Kp2QmX9bT4vR1sLwZ3n; OFF=0
while :; do
H=$(mktemp)
curl -s "https://xenoci.com/api/runner/v1/jobs/$JOB/logs?offset=$OFF" \
-H "Authorization: Bearer $XENOCI_API_KEY" -D "$H"
OFF=$(grep -i '^x-log-next-offset:' "$H" | tr -dc '0-9')
grep -qi '^x-log-complete: true' "$H" && break
sleep 2
doneoffset이 현재 크기보다 크면 빈 본문이 오고 X-Log-Next-Offset은 요청한 값 그대로입니다
아직 로그가 없는 queued 잡도 빈 본문으로 응답합니다
CLI
xenocast build --script ./ci.sh # 제출하고 끝날 때까지 로그 출력
xenocast logs job_7Kp2QmX9bT4vR1sLwZ3n --wait # 이미 제출한 잡을 따라감
xenocast logs job_7Kp2QmX9bT4vR1sLwZ3n --tail 200 # 마지막 200줄
xenocast logs job_7Kp2QmX9bT4vR1sLwZ3n --failure # 첫 오류 줄 주변만
xenocast logs job_7Kp2QmX9bT4vR1sLwZ3n # 지금까지 전체build와 logs --wait는 로그를 표준 출력에 그대로 흘리고, 잡이 끝나면 표준 오류에 한 줄 요약을 냅니다
잡 job_7Kp2QmX9bT4vR1sLwZ3n succeeded (종료 코드 0), 실행 125초, 과금 3분, 금액 $0.1188, 남은 잔액 $12.2377--json을 주면 로그는 표준 오류로, 결과 JSON 한 개만 표준 출력으로 나옵니다
CLI는 출력에서 xci_live_… 모양의 문자열을 가립니다
MCP
status도구는 잡 상태와 함께 마지막 로그 줄을 돌려줍니다 (lines기본 40, 최대 200)logs도구는 전체 로그를 폴더에 파일로 쓰고 경로, 크기, sha256, 마지막 40줄, 실패 요약만 돌려줍니다, 전체 본문을 대화에 넣지 않습니다build에wait: true를 주면 끝날 때까지 로그를 진행 알림으로 흘립니다
콘솔
실행 → 잡 메뉴에서 잡을 열면 상세 패널에 로그가 실시간으로 올라옵니다
분석 → 로그 메뉴는 워크스페이스의 잡과 API 요청 기록을 상태, 기간, 키, 출처로 걸러 찾는 화면이고 API 요청 기록은 30일 보관합니다
GitHub Actions
xeno-ci/build 단계는 잡 로그를 그대로 단계 로그로 흘리고 잡의 종료 코드를 단계의 종료 코드로 돌려줍니다
끝에는 CLI와 같은 요약 한 줄이 남습니다
로그 규칙
- 로그는 잡당 5MiB까지 저장합니다, 넘는 부분은 버리고
[xenoci] log truncated한 줄을 남깁니다, 긴 로그는 파일로 써서 결과물로 받으세요 [xenoci]로 시작하는 줄은 러너가 넣은 것입니다, 업로드 반영 시간, VM 준비 재시도, 결과물 수집 결과가 여기 남습니다- 로그는 스크립트의 표준 출력과 표준 오류를 섞어 기록합니다
- 환경 변수 값은 가려지지 않습니다, 비밀값을
echo하지 마세요
다음 단계
- 실패와 재시도: 로그에서 원인 찾기
- 결과물: 긴 로그를 파일로 받기
- 환경 변수와 비밀값: 로그에 남지 않게 다루기