실제 배포된 운영 서버(Production)에서는 절대 console.log()를 쓰지 않습니다! 서버 컴퓨터를 재부팅하거나 터미널 창을 닫으면 그동안 찍혔던 에러 로그가 공중으로 다 날아가 버리기 때문입니다. 나중에 해커가 공격했거나 치명적인 버그가 터졌을 때 증거를 남기기 위해 파일 형태로 꼼꼼하게 일기(Log)를 쓰는 기술이 필요합니다.
💡 핵심 비유: 블랙박스와 CCTV
- Morgan: 식당 문 앞에 설치된 CCTV. "누가 몇 시에 어떤 문 열고 들어왔다 나감(상태코드 200)"을 꼬박꼬박 기록합니다.
- Winston: 비행기 블랙박스. 시스템 내부 깊숙한 곳에서 심각한 엔진 고장(Error)이 났을 때 영구적인 하드디스크 파일(`error.log`)로 보존합니다.
📝 휘발성 로그 vs 영구 보존 로그
🎚️ Winston의 로그 레벨 (Log Levels)
레벨 (중요도)
의미
예시
error (0)
치명적인 시스템 오류. 개발자에게 즉시 알람이 가야 함
"DB 접속 실패", "결제 모듈 다운"
warn (1)
에러는 아니지만 주의가 필요한 이상 현상
"메모리 사용량 80% 돌파", "비밀번호 5회 틀림"
info (2)
정상적인 서비스 흐름에 대한 중요한 기록
"홍길동님이 로그인함", "새 게시글 작성됨"
debug (3)
개발 과정에서 문제 원인을 파악하기 위해 찍어보는 상세 정보
"변수 x의 현재 값: 42"
Winston 파일 로깅 시뮬레이션
서버 터미널에 임시로 찍히는 로그(Morgan)와, 에러 발생 시 영구적으로 하드디스크에 저장되는 파일 로그(Winston)의 차이를 확인해 보세요.
logger.js (Winston 설정)
const winston = require('winston');
// 1. Winston 로거 생성 및 설정
const logger = winston.createLogger({
level: 'info', // 'info' 레벨 이상의 로그만 기록하겠다 (info, warn, error)
format: winston.format.json(), // 로그를 JSON 형태로 깔끔하게 저장
transports: [
// 에러(error) 전용 로그 파일 (블랙박스)
new winston.transports.File({ filename: 'error.log', level: 'error' }),
// 모든 로그(info 이상)를 기록하는 통합 파일
new winston.transports.File({ filename: 'combined.log' })
]
});
// 2. 개발 환경일 경우, 터미널(Console) 창에도 색상을 입혀서 같이 출력해 줌
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}));
}
module.exports = logger;
// 사용 예시 (다른 라우터 파일에서)
// const logger = require('./logger');
// logger.info("회원가입 완료");
// logger.error("DB 접속 에러!");