Winston

Winston은 Node.js 애플리케이션을 위한 다목적 로깅 라이브러리.

Winston의 주요 특징

  1. 다중 전송(Transport) 지원: 로그를 콘솔, 파일, 데이터베이스 등 여러 곳에 동시에 저장할 수 있다.
  2. 로그 레벨: error, warn, info, verbose, debug, silly 등 다양한 로그 레벨을 제공한다.
  3. 유연한 포맷팅: JSON, 일반 텍스트 등 다양한 형식으로 로그를 출력할 수 있다.
  4. 비동기 로깅: 로그 작성이 애플리케이션의 성능에 영향을 미치지 않도록 비동기적으로 처리한다.

Winston의 장점

  1. 유연성: 다양한 로깅 요구사항을 쉽게 충족시킬 수 있다.
  2. 확장성: 커스텀 전송 방식을 만들어 사용할 수 있다.
  3. 성능: 비동기 로깅으로 애플리케이션 성능에 미치는 영향을 최소화한다.

Winston 시작하기: 단계별 안내 🧭

1. 설치하기

터미널에서 다음 명령어를 실행하세요:

1
npm install winston

2. 기본 로거 생성하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
const winston = require('winston');

// 기본 로거 생성
const logger = winston.createLogger({
  level: 'info',  // 로깅 레벨 설정
  format: winston.format.simple(),  // 로그 형식
  transports: [
    // 콘솔에 로그 출력
    new winston.transports.Console(),
    // 파일에 로그 저장
    new winston.transports.File({ filename: 'app.log' })
  ]
});

// 로그 사용하기
logger.info('안녕하세요, Winston!');
logger.warn('주의가 필요한 상황');
logger.error('에러가 발생했습니다');

3. 로그 레벨 이해하기

Winston은 다음과 같은 로그 레벨을 제공합니다:

  • error: 심각한 오류
  • warn: 경고 메시지
  • info: 일반 정보
  • http: HTTP 요청 관련 정보
  • verbose: 상세 정보
  • debug: 디버깅 정보
  • silly: 가장 상세한 로깅

4. 고급 로깅 설정

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const logger = winston.createLogger({
  level: 'debug',  // 디버그 레벨 이상의 로그 기록
  format: winston.format.combine(
    winston.format.timestamp({  // 타임스탬프 추가
      format: 'YYYY-MM-DD HH:mm:ss'
    }),
    winston.format.json()  // JSON 형식으로 로그 저장
  ),
  transports: [
    // 콘솔 로깅
    new winston.transports.Console({
      format: winston.format.colorize({ all: true })
    }),
    // 에러 로그 파일
    new winston.transports.File({ 
      filename: 'error.log', 
      level: 'error' 
    }),
    // 일반 로그 파일
    new winston.transports.File({ 
      filename: 'combined.log' 
    })
  ]
});

5. 실제 애플리케이션에서의 활용

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function processUserLogin(username) {
  try {
    logger.info(`사용자 로그인 시도: ${username}`);
    
    // 로그인 로직
    
    logger.info(`사용자 로그인 성공: ${username}`);
  } catch (error) {
    logger.error(`로그인 실패: ${username}`, {
      error: error.message,
      stack: error.stack
    });
  }
}

참고 및 출처

GitHub - winstonjs/winston: A logger for just about everything.