Skip to content

[Draft][bug] PR4 Alloy 로그 회전 누락 및 긴 JSON 분할 처리 보완 #263

Open

Description

@PHJ2000

증상

#233의 PR4 로그 파이프라인을 로컬에서 검증하면서 두 문제를 재현했다. 대상은 PR #264의 수정 전 구현(d797108a)이며, 운영 서버의 장애 보고는 아니다.

예상 결과

  • Alloy 중지 중 Docker 로그가 회전해도, 보존 파일에 남아 있는 미수집 로그를 재시작 후 수집한다.
  • Docker가 긴 로그를 나누어 기록해도 Loki에서는 원본 JSON 한 줄로 조회할 수 있다.
  • 서로 다른 컨테이너의 로그나 stdout·stderr 로그가 섞이지 않는다.
  • 인덱스 라벨은 app, env, service, host만 사용한다.

실제 결과 — 수정 전

  1. 회전된 로그 누락: 현재 *-json.log만 탐색해 회전 파일을 읽지 못했다. Docker가 110건을 모두 보존하고 있었지만, Alloy 재시작 후 Loki에서는 순번 109인 1건만 조회됐다.
  2. 긴 JSON 분할: stage.docker로 Docker 로그 레코드에서 앱 로그를 추출한 뒤, 조각을 다시 합치지 않고 전송했다. 40,106바이트 JSON에서 메시지 표식이 있는 항목은 16,384바이트로 조회됐다. 나머지 바이트가 모두 사라졌다는 뜻은 아니며, 원본 JSON 한 줄이 유지되지 않아 필드 검색과 Trace 연결을 온전히 사용할 수 없었다.

영향 및 발생 빈도

  • Alloy 중지와 로그 회전이 겹치면 디스크에 남아 있는 로그가 수집되지 않는다.
  • 긴 JSON 로그의 필드 검색과 요청 추적에 필요한 문맥이 깨진다.
  • 합성 로그를 사용한 로컬 재현 결과다. 운영 발생 빈도는 측정하지 않았다.
  • 기존 통합 검증 7항목에는 이 두 조건이 없었다.

재현 경로

회전 중 재시작

  1. 초기 PR4 구성으로 Docker → Alloy → Loki 수집을 기동한다.
  2. 테스트 로그 생성기의 max-size만 50m에서 64k로 낮추고 max-file=5를 유지한다.
  3. 기본 수집을 확인한 뒤 Alloy를 정상 중지한다.
  4. 고유 표식과 순번 0~109, 약 1KB의 반복 문자열을 가진 JSON 110건을 출력한다.
  5. docker logs에 110건이 모두 남아 있음을 확인하고 Alloy를 다시 기동한다.
  6. 수집 재개를 확인한 뒤 12초 더 기다려 조회하면 1건만 나온다.

긴 JSON

  1. 메시지 표식, 40,000자의 반복 문자열, traceId가 있는 40,106바이트 JSON 한 줄을 출력한다.
  2. Loki에서 메시지 표식으로 조회한 문자열을 원문과 비교한다.
  3. 표식이 있는 항목은 16,384바이트 조각이며 원문과 일치하지 않는다.

환경

  • Local — Windows/WSL, 실제 Docker json-file 로그
  • Dev/Staging
  • Prod
  • 확인일: 2026-09-21
  • Alloy v1.19.2, Loki 3.7.8, Grafana 13.1.3, Tempo 3.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에 명시했다. 서버 배포는 실행하지 않았다.

참고 자료

수정 전: Docker 보존 110건 → Loki 조회 1건
수정 전: 40,106바이트 JSON → 표식이 있는 항목 16,384바이트
수정 후: 회전 로그 110/110건, 40KB JSON 4건과 90KB JSON 원문 일치
수정 후: Alloy 재생성 뒤 기존 로그 재전송 0건, 새 확인 로그 전송 1건

Activity

  1. self-assigned this
    on Sep 21, 2026
  2. changed the title [-][Draft][bug] PR4 Alloy 로그 수집의 rotation 누락 및 긴 JSON 분할 처리 보완[/-] [+][Draft][bug] PR4 Alloy 로그 회전 누락 및 긴 JSON 분할 처리 보완[/+] on Sep 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions