728x90
반응형
이미 winston으로 error나 warning은 추적이 되도록 셋팅되어있지만, 발생한 정확한 쿼리는 알 수 없다.
그래서 쿼리를 저장하고자 하는데,
경험상 파일시스템에 쿼리를 로깅하는것이 빠르고 부하도 적긴 하지만 분석이 쉽지 않았다.
때문에 사이즈가 작은 프로젝트에는 DB에 저장하는 방식을 사용해서 큰 문제가 없을 것이라고 예상되어, 쿼리를 DB에 로깅하는 방식을 구현해보고자 한다.
쿼리를 DB에 로깅하는 방식은 흔하지 않을 것이라고 생각되지만, 프로젝트의 특징에 따라 필요한 경우가 있다고 생각한다. 이번에 직접 경험해보면서 장단점을 파악해보려고 한다 !!
1. 로그 테이블 생성
가장 기본적인 데이터인 id, 쿼리, 시간만 담을 수 있도록 로그 테이블을 생성했다.
CREATE TABLE `logs` (
`id` int NOT NULL AUTO_INCREMENT,
`message` text NOT NULL,
`createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
2. Sequelize 셋팅
const sequelize = new _sequelize(
_config.get('mysql_local.database'),
_config.get('mysql_local.username'),
_config.get('mysql_local.password'),
{
host: _config.get('mysql_local.host'),
dialect: _config.get('mysql_local.dialect'),
logging: (message) => {
console.log(message);
// 로깅을 위한 로깅이 안되도록 예외처리
if (!message.includes('INSERT INTO `logs`')) {
logToDatabase(message);
}
},
timezone: _config.get('mysql_local.timezone'), // Asia/Seoul
},
);
// 로그 테이블 생성
const Log = sequelize.define('log', {
message: {
type: _sequelize.STRING,
allowNull: false,
},
});
// DB에 로그 저장
const logToDatabase = (message) => {
Log.create({ message });
};
기존 Sequelize 셋팅의 logging 프로퍼티만 일부 수정했다. 기존에는 콘솔에 로깅하는 작업만 되어있었지만, logToDatabase 함수가 추가되어 이제 발생하는 쿼리를 모두 DB에 로깅한다.
처음에는 로그를 삽입하는 부분을 예외처리 안했더니 아래 사진처럼 로그를 로깅하기위한 무한루프가 발생했다. 때문에 INSERT INTO `logs' 를 포함한 쿼리는 로깅되지 않도록 예외처리했다.
728x90
반응형
'IT > Node.js' 카테고리의 다른 글
Node.js Sequelize DB 스키마 변경 (0) | 2023.04.13 |
---|---|
Node.js Sequelize 한국 시간대 적용 Asia/Seoul (0) | 2023.03.23 |
Node.js express-validator 사용하기 check VS body (0) | 2023.03.19 |