#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수준)');
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 |