체인의정석

node.js) dotenv를 이용한 환경변수 분리 및 winston을 이용한 logger 만들기 본문

개발/backend

node.js) dotenv를 이용한 환경변수 분리 및 winston을 이용한 logger 만들기

체인의정석 2024. 11. 21. 11:47
728x90
반응형

코드를 서버에 올리게 되면서 logger에 대한 경로나 환경변수 분리 등을 정리해봤다.

먼저 로그를 남기는 경우 winston과 winston-daily-rotate-file을 사용하였다.

        "winston": "^3.17.0",
        "winston-daily-rotate-file": "^5.0.0",

이렇게 2개를 이용하면 로그 레벨 설정과 파일 관리가 편리하였다.

winston 사용방법은 아래에 정리를 따로 해둔것이 있다.

https://it-timehacker.tistory.com/524

 

winston으로 백엔드 로그 관리하기

여태까지 로그 관리의 경우 log4.js로 이미 진행중인 백엔드에 온보딩하여 남긴 경험밖에 없었는데, 따로 이벤트 봇을 만들게 되어 여기서 winston으로 로그 관리를 적용하였으며 이에 대한 내용을

it-timehacker.tistory.com

여기서 추가로 설정한 부분은 dot-env를 이용하여 파일 경로를 분리해준 부분, 그리고 로그 레벨 정도를 설정하는 부분이다.

1. DotENV를 사용한 환경 변수 분리

const winston = require('winston');
require('winston-daily-rotate-file');
const dotenv = require('dotenv');
const envPath = process.env.ENV_PATH;
dotenv.config({ path: envPath });

const info_file_path = process.env.LOG_INFO_PATH;
const error_file_path = process.env.ERROR_INFO_PATH;

먼저 위에 처럼 env를 통해서 기록할 각 로그 파일의 경로를 설정해 준다.

envPath의 경우 참고로 package.json에서 스크립트를 실행할때 넣어주는 형태로 작성하였다.

    "scripts": {
        "dev": "ENV_PATH=.dev.env node 실행할 파일.js",
        "prod": "ENV_PATH=.prod.env node 실행할 파일.js"
    },

npm run dev, npm run prod 이런식으로 스크립트를 실행하면 EVN_PATH가 설정되면서 스크립트가 실행되는데 여기서 env파일의 경로를 받아오기 때문에 이후에 각 env파일 (예시에서는 dev.env, prod.env)에 정의해둔 LOG_INFO_PATH, ERROR_INFO_PATH에서 로그 파일 경로를 입력하게 되면 로그 파일 경로를 설정해 줄 수 있다.

이후 아래와 같이 DailyRotateFile 모듈을 사용해서 파일 경로별로 로그파일이 다르게 나오게 만들 수 있다. 물론 이때 로그를 얼마나 유지할지와 같은 설정도 넣을 수는 있지만 여기서는 제외하였다.

// Daily Rotate File Transport for info level
const infoTransport = new winston.transports.DailyRotateFile({
    level: 'info',
    filename: `${info_file_path}/info-%DATE%.log`,
    datePattern: 'YYYY-MM-DD', // 하루에 하나의 파일 생성
    zippedArchive: true
});

// Daily Rotate File Transport for error level
const errorTransport = new winston.transports.DailyRotateFile({
    level: 'error',
    filename: `${error_file_path}/error-%DATE%.log`,
    datePattern: 'YYYY-MM-DD', // 하루에 하나의 파일 생성
    zippedArchive: true
});

2. 로그레벨 관리

로그 레벨의 경우 여기서는 1까지로 지정을 하였는데, 0은 에러를 1은 info를 의미한다. 위에서 각각 infoTransport, errorTransport를 정의했기 때문에 이를 이용하면 아래와 같은 코드가 나온다.

const logger = winston.createLogger({
    levels: {
        error: 0,
        info: 1
    },
    transports: [
        infoTransport,
        errorTransport,
        new winston.transports.Console({
            level: 'info', // Console 출력 최소 레벨
        })
    ],
    format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.printf(({ timestamp, level, message }) => {
            return `${timestamp} [${level}]: ${message}`;
        })
    )
});

마지막으로 모듈 exports를 해서 로깅이 필요한 부분마다 logger를 가져와서 사용을 하면 된다.

module.exports = {
    logger
}

logger.info, logger.error 이런식으로 하면되고 로그 레벨을 더 세분화 시켜야 한다면 더 세분화 시킬 수 도 있다.

728x90
반응형
Comments