728x90
반응형
이번 포스트는 winston으로 만든 모듈을 라우터에 미들웨어로 사용하는 법을 익히겠다.
1. ./middleware/index.js 파일을 만든다
2. index.js 파일에서 looging 모듈을 export 해준다.
exports.logging = (req, res, next) => {
try {
logger.info('');
}
catch (Err) {
logger.error(Err);
}
}
여기서 어떤 내용을 로그에 담아 모아둘지 생각해야한다. 나같은 경우는
Error
- error 로그는 각 라우터에서 확인
Info
- 어떤 라우터에 접근했는지
- 토큰을 verify 하여 토큰에 대한 정보 ( 로그인 데이터 )
- 메소드 별로 body 나 params, 또는 query (Request Data)
이렇게 할 생각이다. 코드로 구현해보면
./middleware/index.js
const { logger } = require('../config/winston');
const jwt = require("jsonwebtoken");
const secretObj = require("../config/jwt");
exports.logging = (req, res, next) => {
var logStr = {}
try {
// 접속 경로
logStr.url = req.originalUrl;
console.log("cookies : ", req.cookies)
const verify = jwt.verify(
'쿠키 안의 토큰 위치',
secretObj.secret,
{ expiresIn: '86400000' }
)
// 쿠키 안의 토큰 (로그인 정보)
logStr.loginData = verify.isLogined // 토큰의 정보
// 메소드
logStr.method = req.method;
switch (req.method) {
case 'GET':
logStr.query = req.query;
break;
case 'POST':
logStr.body = req.body;
break;
case 'PATCH':
logStr.body = req.body;
break;
case 'DELETE':
logStr.query = req.query;
break;
}
logger.info(JSON.stringify(logStr))
next();
}
catch (Err) {
logger.error(Err)
res.send({ success: false });
}
}
3. 로깅이 필요한 라우터 파일에 logger 를 import 해주고 미들웨어로 심어준다.
const { logging } = require('../middleware/index');
...
router.post("/list", logging, function (req, res, next) {
...
})
4. 파일을 열어 확인해보면 정상적으로 log Data 가 찍힌 것을 볼 수 있다.
원하는 색깔을 넣고 싶을 경우 다음과 같이 하면 된다.
const winston = require('winston');
const winstonDaily = require('winston-daily-rotate-file');
const logDir = 'logs'; // logs 디렉토리 하위에 로그 파일 저장
const { combine, timestamp, printf, colorize } = winston.format;
// Define log format
const logFormat = printf(info => {
return `${info.timestamp} ${info.level}: ${info.message}`;
});
const colors = {
error: 'red',
warn: 'yellow',
info: 'green',
http: 'magenta',
debug: 'blue'
}
winston.addColors(colors)
/*
* Log Level
* error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6
*/
const logger = winston.createLogger({
format: combine(
colorize({ all: true }),
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 })` 포맷으로 출력
)
}));
}
module.exports = { logger };
728x90
반응형