Express winston morgan 로그 관리

권민제·2021년 7월 3일
7

Nodejs

목록 보기
2/3
post-thumbnail

많은 블로그나 자료들을 찾아봤지만 Express 환경에서 로깅을 깔끔하게 정리한 곳들이 많이 없어서 따로 정리해서 올려봅니다.

[2021.08.17] ※ winston을 콘솔에서도 포맷대로 출력 할 수 있게 수정 ver ※

실행 화면 사진은 귀찮아서 업데이트 안했음🤣

💻 Install

$ npm install --save winston winston-daily-rotate-file morgan

Nodejs 환경에서 많이 사용하는 로그 관리 모듈이다

  • winston : 로그 파일 및 로그 레벨 관리 모듈
  • winston-datily-rotate-file : 매일 날짜 별로 로그 파일 생성 및 관리 모듈 ( 시간이 지나면 자동으로 삭제 & 압축 관리 )
  • morgan : request 요청 로깅 미들웨어

winston으로 로그 레벨, 타임라인을 관리하고 morgan으로 요청/응답 정보들을 로깅을 할 수 있게 해서 Express 로그를 관리한다

아래에 GitHub링크 있습니다

따로 winston 전용 파일을 만들어주자

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 

처음 실행한다면 이런식으로 폴더가 생성된다

Combine Format Morgan 로그

Dev Format Morgan 로그

Dev 환경변수로 시작할 때는 이렇게 콘솔에서 출력된다 production은 안뜸

✅ 마무리

winston으로는 로그 파일 관리, 로그에 남길 메세지 관리, 로그 레벨 관리

morgan으로는 request 요청 정보를 로그로 남기면

Express 환경에서는 두 모듈로 로그 관리를 하면 된다.

참고 사이트

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

Code

https://github.com/gwon713/nodejs-winston-morgan.git

profile
성장하는 개발자!

1개의 댓글

comment-user-thumbnail
2022년 11월 22일


은 colorize reset 특수문자인데
파일 출력시에는 colorize를 해제해야 되지 않을까요?

답글 달기