$ npm install --save winston winston-daily-rotate-file morgan
winton.js
const winston = require('winston') ;
const winstonDaily = require('winston-daily-rotate-file');
const { combine, timestamp, printf, colorize } = winston.format;
const logDir = 'logs'; // logs 디렉토리 하위에 로그 파일 저장
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`, // file 이름 날짜로 저장
maxFiles: 30, // 30일치 로그 파일 저장
zippedArchive: true,
}),
// warn 레벨 로그를 저장할 파일 설정
new winstonDaily({
level: 'warn',
datePattern: 'YYYY-MM-DD',
dirname: logDir+ '/warn',
filename: `%DATE%.warn.log`, // file 이름 날짜로 저장
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,
}),
],
});
logger.stream = {// morgan wiston 설정
write: message => {
logger.info(message);
}
}
// Production 환경이 아닌 경우(dev 등) 배포 환경에서는 최대한 자원을 안잡아 먹는 로그를 출력해야함
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: combine(
colorize({ all: true }), // console 에 출력할 로그 컬러 설정 적용함
logFormat // log format 적용
)
}));
}
module.exports = logger;
server.js
const express = require('express');
const path = require('path')// 파일 경로 모듈
require('dotenv').config({ path: path.join(__dirname, './env/server.env') });//dotenv : env 로드 모듈 server.env 환경변수 가져오기
const logger = require('./winston');
const morgan = require('morgan');
const combined = ':remote-addr - :remote-user ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'
// 기존 combined 포멧에서 timestamp만 제거
const morganFormat = process.env.NODE_ENV !== "production" ? "dev" : combined; // NOTE: morgan 출력 형태 server.env에서 NODE_ENV 설정 production : 배포 dev : 개발
console.log(morganFormat);
const app = express();
const port = process.env.PORT || 5000;
app.use(morgan(morganFormat, {stream : logger.stream})); // morgan 로그 설정
app.get('/test/info', (req, res, next) => {
logger.info('info test');
res.status(200).send({
message : "info test!"
})
});
app.get('/test/warn', (req, res, next) => {
logger.warn('warning test');
res.status(400).send({
message : "warning test!"
})
});
app.get('/test/error', (req, res, next) => {
logger.error('error test');
res.status(500).send({
message : "error test!"
})
});
app.listen(port, () => logger.info(`Server Start Listening on port ${port}`));
실행 전에 환경 변수를 설정해주자
server.env
배포 환경
NODE_ENV=production
개발 환경
NODE_ENV=dev
[0m
은 colorize reset 특수문자인데
파일 출력시에는 colorize를 해제해야 되지 않을까요?