Node JS Logger 적용

shinee·2022년 7월 3일
0

NodeJS

목록 보기
6/6

Node JS로 서버를 개발하면서 필요한 부분 중 하나는 로그를 기록하는 것이다.
오늘은 Node JS 개발에 가장 많이 사용되는 logger 패키지인 winston과 http request를 기록(?)할 수 있는 morgan을 사용하여 로그를 남기는 법을 작성해볼 것이다.

1. Winston 적용

우선 npm install winston winston-daily-rotate-file 패키지를 설치한다.
그리고 winston.js 파일을 생성하여 아래와 같이 작성해준다.

import winston from 'winston';
import winstonDaily from 'winston-daily-rotate-file';

const logDir = 'logs'; // log가 저장될 디렉토리
const { combine, timestamp, printf } = winston.format;

// Define log 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 a',
        }),
        logFormat,
    ),
    transports: [
        // info 레벨 로그를 저장할 파일 설정
        new winstonDaily({
            level: 'http',
            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,
        }),
        // Console로 출력
        new winston.transports.Console({
            level: 'http',
            format: winston.format.combine(
                winston.format.colorize(),  // 색깔 넣어서 출력
                logFormat, 
            )})
    ],
});


export { logger };

로그는 error: 0, warn: 1, info: 2, http: 3, verbose: 4, debug: 5, silly: 6 이러한 종류가 있고 숫자가 낮을수록 우선순위가 높다. 그래서 예를 들어 level을 http로 설정하더라도 http erro, warn, info까지 모두 포함된 로그가 기록된다.

logger는 아래와 같이 logger.error/warn/info...('message') 으로 사용한다.

logger.info(`Example app listening on port ${port}`);

서버를 실행하면 콘솔 로그와 로그 파일이 생기는 것을 확인할 수 있다.

2. Morgan 적용하기

우선 npm install morgan --save로 morgan을 설치합니다.

morgan은 format을 combined, common, dev 등과 같이 줄 수 있는데 자세한 옵션은 여기서 확인하면 된다. 나는 winston 쪽에서 이미 날짜와 시간을 설정해주는 부분을 넣었기 때문에 format을 커스터마이징해서 combined과 common 포맷에서 날짜/시간 부분([:date[clf]])만 지웠다.

그리고 morganMiddleware.js 파일을 생성하여 아래와 같이 작성해준다.

import {logger} from "@/config/winston";
import morgan from "morgan";

const combined = ':remote-addr - :remote-user ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'
const common = ':remote-addr - :remote-user ":method :url HTTP/:http-version" :status :res[content-length]'

const format = () => {
    return process.env.NODE_ENV === 'prd' ? combined : common
}

const stream = { write: (message) => logger.http(message) }

const skip = (_, res) => {
    if (process.env.NODE_ENV === 'prd') return res.statusCode < 400
    return false
}

const morganMiddleware = morgan(format(), { stream, skip })

export {morganMiddleware};

이제 index.js 파일로 가서 morganMiddleware를 넣어준다!

postman을 통해 요청을 하나 날려보면 아래와 같이 http요청에 대한 로그가 잘 남는 것을 확인할 수 있다.

참고

profile
developer

0개의 댓글