#1. Log

1. Log 

  • 프로그램의 상태를 관리할 수 있도록 프로그램이 제공하는 정보로서 대부분 텍스트 파일 형태로 존재한다.
  • 서버에 로그 기록을 남기는 것은 개발 과정에서 매우 중요한 부분을 차지한다.

1) winston

  • node.js에서 로그를 파일 형태로 기록할 수 있는 기능을 제공하는 패키지이다.
  • 1년 내내 무중단을 원칙으로 하는 백엔드 시스템의 특성상 상당히 많은 양의 로그가 생성되기 때문에 모든 로그를 하나의 파일에 기록하게 되면 특정 파일의 용량이 매우 커지게 된다.
  • 이를 방지하기 위해 대부분의 로그 패키지들은 날짜별로 파일을 생성하고, 지정한 용량보다 내용이 커질 경우 파일 분할 등의 기능을 기본으로 제공한다.

 

2) 패키지 설치

- winston

  • 로그를 기록하기 위한 패키지
npm install --save winston

또는

yarn add winston

 

 

- winston-daily-rotate-file

  • 로그의 규칙을 정의해서 날짜 별로 저장하기 위한 패키지
npm install --save winston-daily-rotate-file

또는

yarn add winston-daily-rotate-file

 

2. Log 수준 

1) 로그 수준이란?

  • 프로그램이 겪는 어떠한 상황에 대한 심각도를 의미한다.
  • 로그 시스템 자체적으로 수준을 정해 놓거나 개발자가 필요에 따라 수준을 정할 수 있다.
  • winston은 개발자가 직접 정의하는 형태이다.

 

2) 로그 수준 예시

  • 숫자가 낮을 수록 상황이 심각하거나 중요도가 높다는 의미이다.
  • 시스템 설정상에서 기록으로 남길 로그 수준을 2라고 지정한 경우 3,4,5 수준의 로그는 기록되지 않는다.
  • 대부분 개발과정에서는 4 혹은 5로 지정하고 완성 후 실제 서비스 할 때는 0이나 1로 변경한다.
수준 이름 의미
0 error 시스템이 다운될 정도의 심각한 에러가 발생함
1 warn 에러가 발생한 것은 아니지만 비정상 동작을 감지했을 때를 의미(경고)
2 info 프로그램이 동작하는 과정에서 발생하는 주요 정보들을 출력
3 verbose 개발자가 남기는 기록
4 debug 개발자가 프로그램의 흐름을 추적할 용도로 변수 값들을 기록하기 위해 사용

 

3. winston 사용

/** (1) 패키지 참조 */
import { mkdirs } from '../helper/FileHelper.js';
import { join, resolve } from 'path';
import winston from 'winston';
import winstonDaily from 'winston-daily-rotate-file'  ;

// 프로젝트 폴더 위치 조회
// -> __dirname은 노드js의 기본적인 환경변수이다.
// -> ES6에서는 호환이 안되기 때문에 기존 버전과 호환성을 위해 __dirname 사용
const __dirname = resolve();

/** (2) 환경설정 정보 */
const config = {
  // 로그 파일이 저장될 경로 및 출력 레벨
  log: {
    // 개발자가 필요에 의해 기록하는 정보들을 저장할 파일
    debug: {
      path: join(__dirname, '_files/_logs'),
      level: 'debug',
    },
    // 시스템에 심각한 문제가 발생했을 때의 정보를 저장할 파일
    error: {
      path: join(__dirname, '_files/_logs'),
      level: 'error',
    },
  },
};

/** (3) 로그가 저장될 폴더 생성 */
mkdirs(config.log.debug.path);
mkdirs(config.log.error.path);

/** (4) 로그가 출력될 형식 지정 */
// combine: 여러개의 출력 결과를 병합
// timestamp: 날짜출력 형식
// printf: 출력
// slpat: 출력 후 줄바꿈
const { combine, timestamp, printf, splat, simple } = winston.format;

/** (5) winston 객체 만들기 */
const logger = winston.createLogger({
  // 로그의 전반적인 형식
  format: combine(
    timestamp({
      format: 'YY/MM/DD HH:mm:ss SSS',
    }),
    printf((info) => {
      // info.level: 로그 수준
      // info.message: 로그 내용
      return `${info.timestamp} [${info.level}]: ${info.message}`;
    }),
    splat(),
  ),

  // 일반 로그 규칙 정의
  transports: [
    // 하루에 하나씩 파일 형태로 기록하기 위한 설정
    new winstonDaily({
      name: 'debug-file',
      level: config.log.debug.level, // 출력할 로그의 수준
      datePattern: 'YYMMDD', // 파일 이름에 표시될 날짜 형식
      dirname: config.log.debug.path, // 파일이 저장될 위치
      filename: `log_%DATE%.log`, // 파일이름 형식. %DATE%는 datePattern의 값
      maxsize: 500000000,
      maxFiles: 50,
      zippedArchive: true,
    }),

    // 에러 내용만 기록할 별도의 설정
    new winstonDaily({
      name: 'error-file',
      level: config.log.error.level,
      datePattern: 'YYMMDD', // 파일 이름에 표시될 날짜 형식
      dirname: config.log.error.path, // 파일이 저장될 위치
      filename: `error_%DATE%.log`, // 파일이름 형식. %DATE%는 datePattern의 값
      maxsize: 5000000,
      maxFiles: 50,
      zippedArchive: true,
    }),
  ],
});

/** (6) 콘솔 설정 */
// 프로덕션 버전(==상용화 버전)이 아니라면?
// -> production 이라는 말이 없으면 아직 개발중
if (process.env.NODE_ENV !== 'production') {
  logger.add(
    new winston.transports.Console({
      prettyPrint: true,
      showLevel: true,
      level: config.log.debug.level,
      format: combine(
        winston.format.colorize(),
        printf((info) => {
          return `${info.timestamp} [${info.level}]: ${info.message}`;
        })
      ),
    })
  );
}

logger.error('error 메세지 입니다. (1수준)');
logger.warn('warn 메세지 입니다. (2수준)');
logger.info('info 메세지 입니다. (3수준)');
logger.verbose('verbose 메세지 입니다. (4수준)');
logger.debug('debug 메세지 입니다. (5수준)');

_files 밑에 _logs 폴더가 생성되고 log파일이 날짜별로 기록된다.
log 파일 안에 기록된 내용
출력된 내용

 

4. 환경설정

  • dotenv 패키지를 활용하여 프로그램이 구동하는데 필요한 정보들을 별도의 파일에 명시해 놓고 그 파일의 내용을 읽어들여 변수화 하는 방법이다. (ex. openAPI 연동을 위한 API KEY, Database 접속 정도 등)
  • 주로 보안이 필요한 내용을 변도의 파일에 작성한 후 프로젝트 root 이외의 경로에 별도로 보관하는 형태로 활용한다.
  • Node.js는 환경 설정 값을 운영체제의 환경 변수에 저장하는 것을 권장하지만 환경변수 외에 별도의 파일로 작성하는 경우도 존재한다.
    • json 파일을 활용하여 프로그램이 impot 하는 경우
    • 별도의 설정파일을 프로그램 외부에 두는 경우

 

1) dotenv 패키지

  • Node.js로 하여금 시스템 환경변수나 외부 파일에 명시된 설정값들을 로드할 수 있게 하는 패키지
npm install --save dotenv

혹은

yarn add dotenv

 

2) 설정파일 작성 방법

  • 일반 텍스트 파일이며 파일 이름, 확장자 등은 개발자가 자유롭게 설정한다. (일반적으로 *.env 확장자를 사용)
  • 값은 단일 내용을 구성되며 문자열, 숫자등을 구분하지 않고 따옴표 없이 적용한다.
  • 모든 값은 문자열로만 인식된다.
설정변수이름 = 값
설정변수이름 = 값
설정변수이름 = 값

 

3) 설정값 로드

import dotenv from 'dotenv';
dotenv.config({path: 설정파일경로});

console.log(process.env.설정변수이름);

'국비수업 > Node.js' 카테고리의 다른 글

[Node.js] HTTP Client  (0) 2022.06.27
[Node.js] Scheduler  (0) 2022.06.27
[Node.js] Event / File Input Output  (0) 2022.06.24
[Node.js] Node Modules  (0) 2022.06.23
[Node.js] Node.js 개념 이해하기  (0) 2022.06.23

+ Recent posts