반응형
log를 배포하면서 중요성을 많이 느꼈는데, 이번 node.js를 이용하면서 많이 쓰일 것 같아서 정리하고자 한다.
코드 설명
const winston = require('winston'); // -----------------------(1)
require('winston-daily-rotate-file');
const logDir = `${__dirname}/logs`;
const levels = { // ------------------------------------------(2)
error: 0,
warn: 1,
info: 2,
http: 3,
verbose: 4,
debug: 5,
silly: 6
}
const level = () => { // -------------------------------------(3)
const env = process.env.NODE_ENV || 'development'
const isDevelopment = env === 'development'
return isDevelopment ? 'silly' : 'info'
}
const colors = {
error: 'red',
warn: 'magenta',
info: 'yellow',
http: 'green',
verbose: "blue",
debug: "gray",
silly: "black",
}
winston.addColors(colors);
const format = winston.format.combine(// ---------------------(4)
winston.format.timestamp({ format: ' YYYY-MM-DD HH:MM:SS ||' }),
winston.format.colorize({ all: true }),
winston.format.printf(
(info) => `${info.timestamp} [ ${info.level} ] :: ${info.message}`,
),
)
const logger = winston.createLogger({ // ---------------------(5)
format,
level: level(),
transports: [
new winston.transports.DailyRotateFile({
level: 'info',
datePattern: 'YYYY-MM-DD',
dirname: logDir,
filename: `%DATE%.log`,
zippedArchive: true,
handleExceptions: true,
maxFiles: 30,
}),
new winston.transports.DailyRotateFile({
level: 'warn',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/warn',
filename: `%DATE%.warn.log`,
zippedArchive: true,
maxFiles: 30,
}),
new winston.transports.DailyRotateFile({
level: 'error',
datePattern: 'YYYY-MM-DD',
dirname: logDir + '/error',
filename: `%DATE%.error.log`,
zippedArchive: true,
maxFiles: 30,
}),
new winston.transports.Console({
handleExceptions: true,
})
]
});
module.exports = logger;
처음에 log와 관련하여 파일을 작성하려면 설치할 모듈이 있다.
npm install --save winston winston-daily-rotate-file morgan
- winston : 로그 파일 및 로그 레벨 관리 모듈
- winston-datily-rotate-file : 매일 날짜 별로 로그 파일 생성 및 관리 모듈
- morgan : request 요청 로깅 미들웨어
- 설치한 모듈들을 가져온다. 그리고 log와 관련하여 레벨이 낮은 log들은 따로 관리해주기 위하여 logs디렉토리에 정리하고자 하여 만들어준다. ${__dirname}/logs 현재 파일이 있는 경로 /logs의 경로로 파일을 만든다는 것이다. 가끔 정적인 파일을 설정해주기 위해 설정하는 값들이다.
- 0~6까지 레벨들을 설정해주었다. winston의 로그 레벨들은 숫자가 낮을수록 우선순위가 높으니 이점 유념해야 한다. python에서 할 때는 숫자가 높을수록 우선순위가 높았다.
- config.json에서 설정한 것처럼 개발용, 테스트용, 배포용이 있다. 나중에 배포할 때를 생각해서 env를 설정해주고, 지금은 개발중이기에 development용으로 설정해놓는다. 그리고 isDevelopment ? 'silly' : 'info'는 개발중이라면 error~silly까지, 아니라면 모두 다 로그 표시를 의미한다.
- winton에서 지원해주는 컬러를 사용하여 작성하였다. winston.addColors(colors);와 같이 넣어줘야 정상적으로 작동한다.
- 출력을 해주기 위하여 포맷을 작성한다. timestamp, colorize를 설정하고 이를 printf에 적용한다.
- 생성할 로그를 설정해준다. zippedArchive는 압축여부, maxFiles은 파일을 최대 몇일까지 저장할 것인지를 의미한다. 마지막의 코드는 new winston.transports.Console는 handleExceptions: true로 되어있는데 이는 위에서 미리 적용해줘서 적용할게 없다는 말이다.
server에 적용하기
const logger = require('./config/logger'));
app.use(((req, res, next) => {
logger.info('info 메시지');
logger.error('error 메시지');
logger.warn('warn 메시지');
logger.info('info 메시지');
logger.http('http 메시지');
logger.debug('debug 메시지');
next();
}));
이렇게 코드를 다 작성하고 나면 logs파일에 로그들이 쌓이는 것이 눈으로 확인된다.
아래와 같은 사이트를 참고하여 작성하였습니다.
https://velog.io/@gwon713/Express-winston-morgan-로그-관리
https://velog.io/@ash/Node.js-서버에-logging-라이브러리-winston-적용하기
반응형