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
반응형

+ Recent posts