Repository navigation
[Draft][bug] PR4 Alloy 로그 회전 누락 및 긴 JSON 분할 처리 보완 #263
Copy link
Copy link
Open
Labels
bugSomething isn't workingSomething isn't working
Description
증상
#233의 PR4 로그 파이프라인을 로컬에서 검증하면서 두 문제를 재현했다. 대상은 PR #264의 수정 전 구현(d797108a)이며, 운영 서버의 장애 보고는 아니다.
예상 결과
- Alloy 중지 중 Docker 로그가 회전해도, 보존 파일에 남아 있는 미수집 로그를 재시작 후 수집한다.
- Docker가 긴 로그를 나누어 기록해도 Loki에서는 원본 JSON 한 줄로 조회할 수 있다.
- 서로 다른 컨테이너의 로그나 stdout·stderr 로그가 섞이지 않는다.
- 인덱스 라벨은
app,env,service,host만 사용한다.
실제 결과 — 수정 전
- 회전된 로그 누락: 현재
*-json.log만 탐색해 회전 파일을 읽지 못했다. Docker가 110건을 모두 보존하고 있었지만, Alloy 재시작 후 Loki에서는 순번 109인 1건만 조회됐다. - 긴 JSON 분할:
stage.docker로 Docker 로그 레코드에서 앱 로그를 추출한 뒤, 조각을 다시 합치지 않고 전송했다. 40,106바이트 JSON에서 메시지 표식이 있는 항목은 16,384바이트로 조회됐다. 나머지 바이트가 모두 사라졌다는 뜻은 아니며, 원본 JSON 한 줄이 유지되지 않아 필드 검색과 Trace 연결을 온전히 사용할 수 없었다.
영향 및 발생 빈도
- Alloy 중지와 로그 회전이 겹치면 디스크에 남아 있는 로그가 수집되지 않는다.
- 긴 JSON 로그의 필드 검색과 요청 추적에 필요한 문맥이 깨진다.
- 합성 로그를 사용한 로컬 재현 결과다. 운영 발생 빈도는 측정하지 않았다.
- 기존 통합 검증 7항목에는 이 두 조건이 없었다.
재현 경로
회전 중 재시작
- 초기 PR4 구성으로 Docker → Alloy → Loki 수집을 기동한다.
- 테스트 로그 생성기의
max-size만 50m에서 64k로 낮추고max-file=5를 유지한다. - 기본 수집을 확인한 뒤 Alloy를 정상 중지한다.
- 고유 표식과 순번 0~109, 약 1KB의 반복 문자열을 가진 JSON 110건을 출력한다.
docker logs에 110건이 모두 남아 있음을 확인하고 Alloy를 다시 기동한다.- 수집 재개를 확인한 뒤 12초 더 기다려 조회하면 1건만 나온다.
긴 JSON
- 메시지 표식, 40,000자의 반복 문자열, traceId가 있는 40,106바이트 JSON 한 줄을 출력한다.
- Loki에서 메시지 표식으로 조회한 문자열을 원문과 비교한다.
- 표식이 있는 항목은 16,384바이트 조각이며 원문과 일치하지 않는다.
환경
- Local — Windows/WSL, 실제 Docker json-file 로그
- Dev/Staging
- Prod
- 확인일: 2026-09-21
- Alloy
v1.19.2, Loki3.7.8, Grafana13.1.3, Tempo3.0.2 - 테스트 로그 생성기:
python:3.12-slim
심각도
- S1 (서비스 중단/데이터 손상)
- S2 (로그 수집·원문 보존 기능 장애, 로컬 재현)
- S3 (부분 장애/우회 가능)
- S4 (경미)
수정 및 검증 결과
PR #264에서 파일 지문과 읽기 위치를 저장하도록 변경하고, 회전 파일을 오래된 순서로 읽도록 했다. 긴 로그는 컨테이너와 stdout/stderr별로 재조립한다. 반복 문자열이 같은 로그 조각도 구분하도록 파일 지문 크기를 128KiB로 설정했다.
- 중지 중 회전된 로그 110건을 모두 복구하고 원문·순번을 확인했다.
- 정상 수집 중에도 회전을 유발하고, 두 컨테이너의 stdout/stderr가 교차하는 40KB JSON 네 건의 원문 일치와 JSON·traceId 검색을 확인했다.
- 수집기 중지 중 여러 파일에 나뉜 90KB JSON을 원문 그대로 복구했다.
- Alloy 재생성 후 새 확인 로그만 1건 전송됐는지 전송 카운터로 확인했다. Loki의 중복 제거 결과만으로 판단하지 않았다.
- 인덱스 라벨 4개, Grafana 연결, 컨테이너 교체, 짧은 Loki 장애 복구 및 데이터 보존 검증을 유지했다.
- 서버 적용 전 실제 앱 로그 검증 — #233의 서버 AC와 함께 확인한다.
실행 명령은 python3 deploy/observability/scripts/verify-log-pipeline.py이며 CI에서도 같은 검증을 수행한다. 공개 미리보기 수집기 사용, 정렬 설정의 버전별 제약, 재조립 중 종료·장시간 장애에 대한 한계는 PR과 README에 명시했다. 서버 배포는 실행하지 않았다.
참고 자료
- 수정 PR: [feat] Loki·Alloy 로그 파이프라인 및 Grafana logs↔Trace 연결 (4/4) #264
- 상위 작업 및 서버 검증: [feat] 관측 인프라 Terraform + cloud-init IaC 도입 #233
- 초기 수집 설정
- ADR-015: Alloy 수집기
- Alloy filelog receiver
수정 전: Docker 보존 110건 → Loki 조회 1건
수정 전: 40,106바이트 JSON → 표식이 있는 항목 16,384바이트
수정 후: 회전 로그 110/110건, 40KB JSON 4건과 90KB JSON 원문 일치
수정 후: Alloy 재생성 뒤 기존 로그 재전송 0건, 새 확인 로그 전송 1건
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Activity
[-][Draft][bug] PR4 Alloy 로그 수집의 rotation 누락 및 긴 JSON 분할 처리 보완[/-][+][Draft][bug] PR4 Alloy 로그 회전 누락 및 긴 JSON 분할 처리 보완[/+]