본문으로 건너뛰기
runlot
Observability로그

로그

워커의 출력을 실시간으로 확인하고, 레벨·스트림·요청으로 거르고, 지난 며칠 동안 출력한 내용을 찾아봅니다.

runlot logs

Ctrl-C를 누르면 종료합니다. 연결하면 먼저 최근 200줄을 받고, 이후에는 새 로그를 실시간으로 받습니다.

runlot logs --tail 1000        # how many lines to receive up front (max 2000)
runlot logs --no-follow        # print up to the most recent line and exit

실시간 로그 거르기

필터는 줄을 보내기 전에 노드에서 적용하므로, 요청이 많은 워커가 터미널을 뒤덮지 않습니다.

runlot logs --level warn                    # warn and error only
runlot logs --source stderr                 # one stream: stdout, stderr or runlot
runlot logs --request 4bf92f3577b34da6a3ce929d0e0e4736
runlot logs --tail 500 --grep timeout       # --grep filters the live tail when --tail or --no-follow is given

레벨의 순서는 debug < log = info < warn < error이며, --level은 지정한 레벨과 그보다 높은 레벨을 모두 남깁니다. level 필드가 있는 JSON으로 출력한 줄은 그 레벨로 셉니다. 그렇지 않으면 stderr는 error, stdout은 log입니다. runlot 스트림은 프로젝트에 대해 Runlot이 직접 남기는 줄입니다. 시작, 중지, 메모리 부족 같은 것입니다.

--format json은 저장된 이벤트와 같은 형태로 한 줄에 객체 하나씩 출력합니다.

runlot logs --format json | jq 'select(.level == "error")'

지난 로그

runlot logs는 지금 이 순간부터의 출력을 따라갑니다. 그 전에 출력한 내용을 보려면 기간을 지정합니다.

runlot logs --since 2h                  # the last two hours
runlot logs --since 24h --grep ERROR    # only lines containing ERROR
runlot logs --since 2026-09-20T10:00 --until 2026-09-20T11:00
runlot logs --since 6h --level error --source exception

--since와 --until은 기간(30m, 2h, 3d) 또는 시각(2026-09-20T10:00, 혹은 2026-09-20처럼 날짜만)을 받습니다. 시각은 UTC이며, 출력된 줄에 찍히는 시간대와 같아서 출력에서 복사한 타임스탬프를 그대로 다시 붙여 넣을 수 있습니다. 대신 자신의 시간대를 지정하려면 뒤에 +09:00 또는 -04:30을 붙이세요. --grep만 단독으로 쓰면 저장된 로그를 검색합니다. 정규 표현식이 아니라 단순 부분 문자열입니다.

저장된 로그에는 실시간 로그보다 소스가 두 가지 더 있습니다. console(수집 대상인 요청의 콘솔 줄)과 exception입니다. --level, --request와 이 두 소스는 이벤트 저장소가 필요합니다. ClickHouse가 없는 자체 호스팅 설치에서는 이를 무시하지 않고 이름을 밝혀 거부합니다.

지난 로그는 오래된 줄부터 출력하고, 한 페이지를 넘는 기간이면 다음 페이지를 가져오는 방법을 마지막 줄에 안내합니다.

-- more available: rerun with --cursor obs.1790244251882.3

--limit은 페이지당 줄 수를 정합니다(기본 200, 최대 1,000). 대시보드의 Observability → Logs에도 같은 기능이 있으며, 기간 선택기와 검색창이 있습니다.

로그 보관 기간

워커가 출력한 모든 줄은 Free 플랜 3일, Pro 플랜 7일 동안 보관합니다. 그 뒤에는 삭제하며 복구할 수 없습니다. 더 오래 보관하려면 자신의 버킷이나 수집기로 내보내세요.

프로젝트 하나가 하루에 저장할 수 있는 로그 이벤트는 Free 플랜 200,000개, Pro 플랜 2,000,000개이며, UTC 날짜를 기준으로 셉니다. 이 한도를 넘어도 실시간 로그는 전과 똑같이 동작하고, 그날 남은 시간 동안은 이벤트 100개 중 1개를 보관합니다. 요청 단위로 고르므로 한 요청의 줄은 함께 남습니다. Query Builder의 개수는 가중치를 적용하므로 여전히 실제 양을 추정합니다. Pro에서는 한도를 올리거나 제거할 수 있습니다. 한도와 비용을 참고하세요.

ClickHouse가 없는 자체 호스팅 설치는 같은 일일 한도로 저장된 줄을 PostgreSQL에 보관하고, 한도에 도달하면 그날의 저장을 멈추며 다음 줄을 한 번 남깁니다.

runlot: daily log cap reached (200000 lines); further lines today are dropped
실시간 로그와 저장된 기록은 서로 다른 것입니다. 실시간 로그는 노드 메모리의 링 버퍼를 읽습니다. 프로젝트별로 2,000줄 또는 1 MiB 중 먼저 도달하는 제한까지 보관하고, 노드 에이전트를 재시작하면 비워집니다. 기록은 컨트롤 플레인에 저장하므로 재시작, 재배포, 프로젝트의 노드 이동에도 남아 있습니다.

건너뛴 로그 알림

runlot logs를 실행한 터미널이 출력을 충분히 빨리 처리하지 못하면, 해당 스트림에서는 일부 로그 줄을 건너뜁니다. 느린 로그 구독이 프로젝트의 실행을 지연시키지 않도록 하기 위한 동작입니다.

건너뛴 로그 줄 수는 스트림의 알림 이벤트로 표시합니다.

-- dropped 128 lines — this log stream could not keep up with the worker

로그가 원래 없었던 경우와 전송 중 건너뛴 경우를 구분할 수 있도록 이 알림을 제공합니다.

파이프로 쓸 때

스트림 종료 알림과 페이지 안내는 stderr로 출력합니다.

runlot logs --no-follow | grep ERROR

파이프의 grep에는 워커가 출력한 로그 줄만 전달됩니다.

로그 항목 크기 제한

실시간 로그에서 각 로그 항목은 최대 64 KiB입니다. 수집한 console.log는 256 KiB에서 잘리고 truncated로 표시됩니다.

객체 로깅

첫 번째 인자로 일반 객체를 출력하면 그 필드가 쿼리할 수 있는 키가 됩니다.

console.log({ event: "checkout", userId: 42, cents: 1999 });

Query Builder에서 userId와 cents는 기본 제공 필드처럼 필터링할 수 있고, 그룹으로 묶거나 합산할 수 있습니다.

이 페이지의 목차