Skip to content

fix: 파일 로그를 JSON 포맷으로 변경하여 스택트레이스 분리 수집 문제 해결 - #482

Merged
pooreumjung merged 1 commit into
developfrom
fix/#478-json-file-logging
Sep 24, 2026
Merged

pooreumjung merged 1 commit into
developfrom
fix/#478-json-file-logging

Conversation

@pooreumjung

Copy link
Copy Markdown
Member

#️⃣ Issue Number

📝 요약(Summary)

  • 문제: Grafana Cloud(Loki)에서 reqId로 검색하면 에러 로그의 첫 줄만 나오고 스택트레이스가 빠졌습니다. 평문 로그의 스택트레이스(at ...) 줄이 Alloy에서 한 줄씩 별도 로그로 수집되면서, reqId도 레벨도 없는 조각으로 흩어졌기 때문입니다.
  • 변경: 파일 로그(/var/log/eatssu/app.log)만 JSON 포맷으로 바꿔서, 로그 한 건과 스택트레이스가 JSON 한 줄로 기록되도록 했습니다.
    • build.gradle: logstash-logback-encoder:7.4를 추가했습니다. Spring Boot 3.0.4에 포함된 Logback 1.4.5와 호환되는 7.x 버전입니다.
    • logback-spring.xml: FILE appender의 encoder를 LogstashEncoder로 바꾸고, 타임스탬프를 Asia/Seoul로 지정했습니다. 더 이상 쓰지 않는 FILE_LOG_PATTERN은 삭제했습니다.
  • 효과:
    • stack_trace, level, requestId(MDC), logger_name, thread_name이 JSON 필드로 분리됩니다.
    • Loki에서 | json | requestId="..."처럼 필드로 검색할 수 있습니다.
    • Grafana의 detected_level이 본문 추정이 아니라 level 필드 기준으로 정확히 잡힙니다.
  • 변경하지 않은 부분: 콘솔 로그(stdout → CloudWatch)와 로컬 개발 환경의 로그는 기존 평문 그대로입니다. 파일 경로도 같아서 Alloy 설정은 바꿀 필요가 없습니다.

💬 공유사항 to 리뷰어

  • 배포 후 Loki 조회 방식이 바뀝니다.
    • 기존에 쓰던 |= "reqId=..." 문자열 검색은 더 이상 걸리지 않습니다. JSON에서는 "requestId":"..." 형태로 찍히기 때문입니다.
    • 앞으로는 {service_name="eatssu-prod"} | json | requestId="<값>"으로 조회하거나, |= "<값>"처럼 값만 넣어 검색하면 됩니다.
  • Grafana 시각은 여전히 Alloy가 읽은 시각입니다. 로그 발생 시각과는 0.1초 정도 차이가 납니다. 필요해지면 Alloy에 stage.json과 stage.timestamp를 추가하면 되는데, 이번 PR에는 넣지 않았습니다.
  • 로그 용량이 늘어납니다. JSON은 필드 이름이 반복돼서 평문보다 1.5~2배 정도 커질 것으로 예상합니다. 현재 월 로그 수집량이 약 332MiB라 Grafana Cloud 한도에는 여유가 있습니다.
  • 검증 범위와 한계:
    • 같은 encoder 설정으로 예외 로그를 따로 출력해 봤고, 스택트레이스·requestId·KST 시각이 JSON 한 줄로 찍히는 것을 확인했습니다.
    • 전체 테스트 632개가 통과했습니다. 다만 FILE appender는 prod/dev 프로필에서만 켜지기 때문에, 이번 변경 부분은 테스트로 검증되지 않았습니다.
    • dev 배포 후 확인이 필요합니다. GET /error-test를 호출한 뒤 {service_name="eatssu-dev"} | json으로 조회해서 stack_trace 필드가 함께 나오는지 봐 주세요.
  • 참고 (이번 PR 범위 밖): 로컬에서 테스트를 두 번 이상 돌리면 실패하는 문제를 발견해 #481로 분리했습니다. 테스트 프로필의 ddl-auto: create-drop과 Flyway가 충돌하는 문제입니다.

✅ PR Checklist

PR이 다음 요구 사항을 충족하는지 확인하세요.

  • 커밋 메시지 컨벤션에 맞게 작성했습니다.
  • 변경 사항에 대한 테스트를 했습니다.(버그 수정/기능에 대한 테스트).

🤖 Generated with Claude Code

@pooreumjung pooreumjung added the fix 고치기 label Sep 24, 2026
@pooreumjung pooreumjung self-assigned this Sep 24, 2026
@github-actions

Copy link
Copy Markdown

📊 테스트 커버리지 리포트

Overall Project 95.61% 🍏

There is no coverage information present for the Files changed

@pooreumjung
pooreumjung merged commit 217095e into develop Sep 24, 2026
1 check passed
@pooreumjung
pooreumjung deleted the fix/#478-json-file-logging branch September 24, 2026 05:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 고치기

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: Grafana Loki에서 에러 로그의 스택트레이스가 요청 로그와 분리되어 수집되는 문제

1 participant