Día de Ruru
에러 로깅 시스템 구축 본문
문제점
기존에 사용하던 winston을 사용한 에러로그확인 방식은 서버 컴퓨터에 직접 들어가서 해당 날짜의 에러 로그 파일을 찾은 후 에러 로그를 확인해야 하는 부분이 너무 번거롭고 불편했다.
✔ 해결방법
클라우드 기반의 팀 협업 툴인 Slack을 이용해서 팀원 전체가 실시간으로 서버 에러를 모니터링 할 수 있게 적용했다.
✔ 도입
- 먼저 Slack에 서버를 추가하고 incomming webhooks 을 설치한 후, URL을 발급받았다.
👉 토큰을 발급 받아서 사용할 수도 있지만 incomming webhooks은 메세지 전송에 특화되어 있어서 더 다양한 기능을 시도해 볼 수 있다. 그리고 애초에 토큰이 없기 때문에 토큰 탈취로 인한 정보 유출의 가능성이 아예 없다. - URL 을 발급 받았으면 Slack에서 요구하는 기본 틀에 맞춰서 메세지를 보내주면 된다.
module.exports = async (message) => {
// 보내줄 메세지 형태 작성
const data = {
mrkdwn: true,
text: '',
attachments: []
};
message.footer = "From Meer API Server";
data.attachments.push(message); //모든 메세지에 footer 추가 후 전송
// Slack에 전송하기 위해서 axios 사용
axios({
url: //발급 받은 URL,
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
data
});
};
- Slack에 메세지를 보낼 때에는 axios를 사용해서 보내면 된다. 위의 코드를 미들웨어로 등록해두고 app.js에서 require해서 사용했다.
const message = {
color : '#DC3545',
title : "에러가 발생했습니다.",
text : `errorMessage : *[${err.status}]* ${err.message}`,
}
slackMiddleware(message)
✔ 슬랙에서 에러 메세지를 바로바로 확인할 수는 있지만 오래된 에러로그를 확인할 때에는 불편한 점이 있어서 wiston 과 winston-daily-rotate-file을 사용해서 날짜별로 에러로그를 따로 저장해주었다.
const transport = new transports.DailyRotateFile({
filename: "errorlogs-%DATE%.log",
datePattern: "YYYY-MM-DD-HH",
zippedArchive: true,
maxSize: "20m",
maxFiles: "14d",
dirname: "./logs",
level: "http",
format: printLogformat,
});
const logger = createLogger({
transports: [
transport,
new transports.Console({
level: "http",
format: ConsoleprintLogformat,
}),
],
});
'항해99 > FinalProject' 카테고리의 다른 글
fileName, fileLocation 조회 코드 개선 (0) | 2023.05.15 |
---|---|
[트랜잭션]회원가입 도중 에러 발생 시 재시도 불가능 에러 (0) | 2023.05.13 |
Comments