4.7 KiB
4.7 KiB
Phase 9. 실행 로그 및 DB 쿼리 로그
로그 정책
환경 구분
APP_ENV |
설명 |
|---|---|
local |
맥미니 개발 환경 |
stage |
NAS에서 stage DB로 구동하는 검증 환경 |
production |
NAS에서 운영 DB로 구동하는 실제 서비스 환경 |
NODE_ENV는 Next.js 빌드 방식(dev/prod)을 제어하고, APP_ENV는 로그 레벨·상세도를 제어한다.
로그 레벨
LOG_LEVEL |
출력 대상 |
|---|---|
debug |
debug + info + warn + error |
info |
info + warn + error |
warn |
warn + error |
error |
error만 |
LOG_LEVEL을 명시하지 않으면 APP_ENV=production일 때 info, 그 외는 debug가 기본값.
출력 형식
[2026-06-22T10:00:00.000Z] [INFO ] [maestros] list fetched {"totalCount":120,"duration":45}
[2026-06-22T10:00:00.000Z] [WARN ] [extension-requests/[id]] 이미 처리된 연장 신청입니다. {"id":5,"status":409,"duration":12}
[2026-06-22T10:00:00.000Z] [ERROR] [upgrade-requests/[id]] unexpected error {"id":3,"error":"...","duration":5}
warn/error는 stderr, 그 외는 stdout으로 출력한다.- JSON 데이터는 한 줄로 직렬화한다 (Docker 로그 파싱 편의).
민감정보 마스킹 대상
아래 값은 로그에 포함하지 않는다:
- 관리자 패스워드 (form 입력값, DB 조회 파라미터)
AUTH_SECRET/NEXTAUTH_SECRETDATABASE_URL(패스워드 포함)- 세션 토큰 / JWT 페이로드 원문
- SMTP 패스워드
현재 auth.ts의 raw SQL 파라미터에 패스워드가 포함될 수 있으므로 DB query 이벤트 핸들러 구현 시 PASSWORD( 포함 쿼리의 params를 마스킹한다 (Phase 9 DB query 로그 구현 시 처리).
환경변수
| 변수 | 설명 | 기본값 |
|---|---|---|
APP_ENV |
환경 구분 (local|stage|production) |
local |
LOG_LEVEL |
최소 로그 레벨 (debug|info|warn|error) |
APP_ENV에 따라 자동 |
DB_SLOW_QUERY_MS |
DB 쿼리 slow query 임계값(ms) — DB query 로그 구현 시 사용 | 1000 |
권장 .env 설정
.env.local (개발)
APP_ENV=local
LOG_LEVEL=debug
.env.stage (검증)
APP_ENV=stage
LOG_LEVEL=debug
.env.production (운영)
APP_ENV=production
LOG_LEVEL=info
DB_SLOW_QUERY_MS=500
적용 현황
완료
lib/logger.ts— 공통 logger 모듈 (레벨 필터링, 포맷, stderr/stdout 분기)- 로그인 성공/실패 로그 (
auth.ts) - 마에스트로 목록/상세 조회 로그
- 연장 신청 조회/승인/취소 로그 (409는 warn, 그 외 예외는 error)
- 업그레이드 신청 조회/승인/거절 로그 (409는 warn, 그 외 예외는 error)
미완료 (별도 확인 후 진행)
- Correlation ID: Edge Middleware(
proxy.ts)에서x-correlation-id헤더 생성 → API route에서 AsyncLocalStorage로 전달하는 구조. 구현 전 설계 확정 필요. - DB query 로그:
@prisma/adapter-mariadb+ Prisma query 이벤트 호환성 확인 필요.$on('query', handler)발화 여부를 local에서 테스트한 뒤 진행. - 결과 row/count 로그: Prisma query 이벤트에 결과 데이터가 없음.
$extendsquery 컴포넌트 방식으로 재설계하거나 계획 범위 축소 필요.
Docker / NAS 로그 운영 절차
애플리케이션 로그 확인
# 실시간 스트리밍
docker compose logs -f chocoadmin
# 최근 100줄
docker compose logs --tail=100 chocoadmin
# 특정 시간 이후
docker compose logs --since="2026-06-22T10:00:00" chocoadmin
warn/error만 필터링
docker compose logs -f chocoadmin 2>&1 | grep -E '\[(WARN |ERROR)\]'
Nginx Proxy Manager 로그와 함께 확인
Synology NAS에서 Nginx Proxy Manager(NPM)와 chocoadmin 로그를 같이 보려면:
# NPM access log (컨테이너 이름은 환경에 맞게 조정)
docker logs nginx-proxy-manager 2>&1 | tail -50
# 두 로그를 동시에
docker compose logs -f chocoadmin &
docker logs -f nginx-proxy-manager
NPM의 access log에는 클라이언트 IP, HTTP method, path, status code, 응답 시간이 기록되고, chocoadmin 로그에는 인증 결과와 비즈니스 처리 결과가 기록된다. status=409를 NPM 로그에서 발견했을 때 chocoadmin의 [WARN] 로그와 함께 원인을 추적한다.
stage/production 로그 레벨 차이
| 항목 | stage | production |
|---|---|---|
LOG_LEVEL |
debug |
info |
| 요청 시작 로그 | 출력 (debug) | 미출력 |
| 성공 응답 로그 | 출력 (info) | 출력 (info) |
| 인증 실패/409 로그 | 출력 (warn, stderr) | 출력 (warn, stderr) |
| 예외/500 로그 | 출력 (error, stderr) | 출력 (error, stderr) |