📝

21. 로그 처리 모듈

인터넷에 돌아다니는 winston 글 중 업데이트 된 내용으로 포스팅 된 것이 거의 없어 공식문서와 업데이트 포스팅을 참고삼아 로그 처리하는 내용을 작성합니다.

참고자료

// 아래 참고자료 코드 수정하여 개시 // 참고자료 : https://velog.io/@ash/Node.js-%EC%84%9C%EB%B2%84%EC%97%90-logging-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-winston-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0 // npm init --yes // "type":"module", // npm install express winston winston-daily-rotate-file // winston 모듈의 로그 수준 // https://github.com/winstonjs/winston // log levels // const levels = { // error: 0, // warn: 1, // info: 2, // http: 3, // verbose: 4, // debug: 5, // silly: 6 // }; import express from 'express'; import { logger } from './config/winston.js'; const app = express(); app.get('/', (req, res, next) => { logger.info('GET /'); //GET / {"timestamp":"2021-12-27 01:43:12"} 와 같은 형식으로 로그 남김 res.sendStatus(200); }); app.get('/notice/:id', (req, res, next) => { // http://localhost:8080/notice/300 // info: GET /notice/300 {"timestamp":"2021-12-27 11:10:18"} logger.info(`GET /notice/${req.params.id}`); res.sendStatus(200); }); app.get('/error', (req, res) => { logger.error('Error message'); res.sendStatus(500); }); app.listen(8080);
 
// config 폴더 안에 winston.js import winston from 'winston'; import winstonDaily from 'winston-daily-rotate-file'; // logs 저장 디렉토리 설정 // error는 logs 아래 error에 저장 const logDir = 'logs'; const { combine, timestamp, printf } = winston.format; // 로그 포멧 지정 const logFormat = printf(info => { return `${info.timestamp} ${info.level}: ${info.message}`; }); /* * Log Level * error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 */ const logger = winston.createLogger({ format: combine( timestamp({ format: 'YYYY-MM-DD HH:mm:ss', }), logFormat, ), transports: [ // info 레벨 로그를 저장할 파일 설정 new winstonDaily({ level: 'info', datePattern: 'YYYY-MM-DD', dirname: logDir, filename: `%DATE%.log`, maxFiles: 30, // 30일치 로그 파일 저장 zippedArchive: true, }), // error 레벨 로그를 저장할 파일 설정 new winstonDaily({ level: 'error', datePattern: 'YYYY-MM-DD', dirname: logDir + '/error', // error.log 파일은 /logs/error 하위에 저장 filename: `%DATE%.error.log`, maxFiles: 30, zippedArchive: true, }), ], }); // Production 환경이 아닌 경우(dev 등) if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), // 색깔 넣어서 출력 winston.format.simple(), // `${info.level}: ${info.message} JSON.stringify({ ...rest })` 포맷으로 출력 ) })); } export { logger };