다운 규약 문서

규약 목록 개발 규약

로그 파일 정책

날짜/카테고리 폴더 구조, 경로를 한 모듈에서만 만드는 규칙, 조사 순서대로 번호 매긴 카테고리, 보존 기간.

공개범위
공개
버전
1.0.0
수정일
2026-10-27
담당
서버개발팀
원본
마크다운

#logging#operations#debugging

이 문서의 목차
  1. 폴더 구조
  2. 경로는 한 모듈에서만 만든다
  3. 카테고리 — 번호 = 조사 순서
  4. 개별 파일과 통합 파일
  5. 보존
  6. 로그에 남기지 않는 것

폴더 구조

logs/
└── YYYY-MM-DD/
    ├── 00_INDEX.txt          ← 증상 → 볼 파일 안내 (자동 생성)
    ├── 01_INTEGRATED/
    ├── 02_CLUSTER/
    │   ├── _CLUSTER-2026-10-27.log   ← 소량 모듈 통합 파일
    │   └── BUFFER-2026-10-27.log     ← 대용량 모듈 개별 파일
    ├── 03_EZIIO/
    └── ...
  • 날짜 폴더 안에서 도메인별로 나눕니다.
  • 각 날짜 폴더에 증상 → 볼 파일 안내 파일을 자동으로 만들어 둡니다.

왜 — 장애가 났을 때 "어느 날, 어느 도메인"부터 좁혀 들어가는 것이 가장 빠릅니다. 한 폴더에 수백 개 파일이 쌓이면 찾는 데만 시간이 걸립니다.

경로는 한 모듈에서만 만든다

로그 경로와 카테고리를 정하는 단일 출처 모듈을 하나 두고, 다른 곳에서는 경로를 직접 조립하지 않습니다.

// O — 모듈 이름만 넘기면 카테고리·경로는 공용 모듈이 정한다
const log = (...args) => logToFile(path.basename(__filename, '.js'), ...args);

// X — 경로를 직접 조립
fs.appendFileSync(path.join(logDir, 'my.log'), msg);
  • 파일(모듈) 이름이 곧 로그 접두사가 되고, 공용 모듈이 카테고리를 자동으로 정합니다.
  • 규칙에 없는 새 접두사는 미분류(99_ETC) 로 가고 경고가 1회 남습니다. 이 경고를 보면 분류 규칙에 반드시 추가합니다.
  • 파일에 직접 써야 할 때도 경로는 공용 모듈에서 받습니다. 공용 모듈이 폴더를 만들어 주기 때문입니다.

왜 — 날짜 폴더가 아직 없을 때 직접 쓰면 "폴더 없음(ENOENT)" 오류로 로그가 통째로 사라집니다.

카테고리 — 번호 = 조사 순서

폴더담는 것
01_INTEGRATED여러 도메인을 시간순으로 모은 통합 로그
02_CLUSTER세척·우유밀기·버퍼탱크·밸브·냉각기 (판정 = 논리 계층)
03_EZIIO입출력장치 액션·핀·장비 통신 (물리 계층)
04_MQTT메시지 원문·발행
05_GATE스마트게이트 / 슬라이딩도어
06_ROBOT로봇·착유
07_FEED급이기·사료·소
08_ALERT문자·메신저·푸시·오류 창
09_BATCH야간 배치·집계·내보내기
10_DBDB·느린 쿼리·디스크·파일 전송·실패 SQL
11_WEBHTTP 접근·설정 캐시·외부 연동
99_ETC미분류 — 여기 파일이 생기면 규칙에 추가하라는 신호

번호 순서대로 보면 통합 흐름 → 판정 → 물리 동작 → 통신 원문 순으로 원인을 좁힐 수 있습니다.

개별 파일과 통합 파일

  • 대용량이거나 장애 때 통째로 읽는 핵심 로그만 자기 파일을 갖습니다. (기준 예: 하루 1MB 이상)
  • 나머지 소량 모듈은 카테고리 통합 파일(_<카테고리>-날짜.log)에 [모듈명] 태그와 함께 합칩니다.
# 통합 파일에서 특정 모듈만 보기
grep "\[gateComControl\]" _GATE-2026-10-27.log

보존

  • 보존 로직은 한 모듈에만 둡니다. 새로 만들지 않습니다.
  • 날짜 폴더 단위로, 정한 기간(예: 15일)이 지나면 폴더째 삭제합니다.
  • 여러 로그 출력기가 보존 장부(audit 파일)를 공유하지 않게 합니다 — 서로 덮어써서 보존이 깨집니다.

로그에 남기지 않는 것

  • 비밀번호·토큰·키 등 비밀값
  • 필요 이상의 개인정보(전화번호 전체 등). 꼭 필요하면 일부를 가립니다.

자세한 내용은 '보안 기본 규칙' 문서를 참조하세요.