일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스마트컨트렉트 함수이름 중복 호출
- erc4337 contract
- Vue.js
- 스마트컨트렉트테스트
- 오블완
- erc4337
- 스마트 컨트렉트 함수이름 중복
- 계정추상화
- 컨트렉트 동일한 함수이름 호출
- vue기초
- multicall
- Vue
- ethers
- 체인의정석
- 러스트기초
- ethers typescript
- 러스트 기초
- ethers websocket
- 티스토리챌린지
- 스마트컨트렉트 예약어 함수이름 중복
- SBT표준
- ethers v6
- ambiguous function description
- 러스트 기초 학습
- 머신러닝기초
- chainlink 설명
- git rebase
- ethers type
- 컨트렉트 배포 자동화
- rust 기초
- Today
- Total
체인의정석
node.js) dotenv를 이용한 환경변수 분리 및 winston을 이용한 logger 만들기 본문
코드를 서버에 올리게 되면서 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 이런식으로 하면되고 로그 레벨을 더 세분화 시켜야 한다면 더 세분화 시킬 수 도 있다.
'개발 > backend' 카테고리의 다른 글
node.js) UTC 시간 기준으로 날짜를 저장하는 방법, blocktimestamp로 부터 UTC시간 도출하는 방법 (0) | 2024.11.21 |
---|---|
node.js) mysql2를 사용하여 db query, insert 하는 코드 (0) | 2024.11.21 |
winston으로 백엔드 로그 관리하기 (1) | 2024.09.04 |
주기적으로 재시작 하는 node.js 프로그램 만들기 (pm2 ecosystem, crone) (1) | 2024.07.05 |
mac에서 Jmeter 설치 및 사용해서 api 테스트해보기 (0) | 2024.02.13 |