웹 프로젝트를 운영하다 보면, 사용자의 요청에 예기치 않게 오류가 발생할 때가 있습니다. (null , undefined 처리 안함, 코드 오류 등) log를 실시간으로 보고 있으면 바로 에러코드를 보고 문제를 해결할 수 있지만, 현실적으로 하루종일 로그만 처다보고 있을수만은 없으니까요.
이번시간에는 텔레그램 API를 활용하여 봇으로 서버 에러 발생 시 해당 에러를 텔레그램 메세지로 전송하여 바로 에러 내용을 알 수 있게 해보겠습니다.
텔레그램 설치
우선 텔레그램이 없으신 분들은 아래 링크로 들어가셔서 설치하시기 바랍니다.
https://telegram.org/
안드로이드는 Google Play, IOS는 AppStore를 통해서 다운로드 가능합니다.회원가입을 완료 후 아래 “탤레그렘 봇 생성” 단계를 보시면 됩니다.
텔레그램 봇 생성
이제 봇을 생성해 주겠습니다.
https://telegram.me/botfather 이 링크를 클릭하시거나, Telegram 검색에서 BotFather 를 검색하신 후 들어가 줍니다.
봇을 클릭하여 채팅창에 /start 를 입력 후 엔터를 눌러 봇을 활성화 하여 줍니다.
이런 화면이 보이시면 봇이 정상적으로 활성화 된 것입니다.
이제 새로운 봇을 만들어 보겠습니다. 메뉴에 보이는 /newbot 을 눌러줍니다.
이런식으로 떳으면 이제 사용할 봇 이름을 입력해야 합니다. 봇 이름을 설정하실 땐 botname_bot 이런식으로 끝에 _bot을 붙여주셔야 합니다. (예: SERVER_ALERT 이라는 이름으로 봇을 생성할 시 -> SERVER_ALERT_bot)
기존에 다른 사용자가 해당 봇 이름을 사용중이라면, 아래처럼 오류가 발생하니 오류가 발생 시 다른이름으로 입력해주시면 됩니다.
저는 ifixcomputer_SERVER_ALERT_bot 이름으로 만들겠습니다.
이런식으로 봇 생성이 정상적으로 되었으면 아래의 생성된 API키를 잘 보관해 주셔야 합니다. 해당 API키가 외부인에게 노출 될 시 해당 봇 알림이 다른 사용자나 타인이 다른용도로 사용할 수도 있기 때문입니다.
이제 자신의 봇 이름을 클릭하여 해당 봇 채팅방으로 이동하겠습니다.
봇으로 이동하였으면, 아래에 보이는 start 버튼을 클릭하여 봇을 활성화 시켜줍니다.
이제 client ID를 알아내야 합니다. 아까 저장해둔 토큰값을 사용하여 요청을 보내보겠습니다.
요청 주소는 아래와 같습니다
https://api.telegram.org/bot<토큰키>/getUpdates
이런식으로 JSON 결과가 나오면 봇 생성이 완료된 것입니다. 이제 클라이언트 아이디를 알아내기 위해서 아까 생성한 봇 채팅창으로 이동하여 한번더 /start 를 입력 후 전송해 줍니다.
위 사진처럼 결과가 출력됩니다. 저희는 from 내부에 있는 id 값을 사용할 거기 때문에 해당 from 안에 있는 id키를 복사하시면 됩니다. 복사 후 간단하게 봇에게 테스트 메세지를 전송해 보겠습니다.
생성한 봇 테스트
이제 아래의 주소로 요청을 보내보세요. 자신이 만든 텔레그램 봇한테 메세지가 날라올 겁니다.
https://api.telegram.org/bot<토큰키>/sendmessage?chat_id=<복사한 클라이언트 아이디>&text=<입력할 메세지>
이렇게 입력 후 전송하면,
이렇게 봇이 테스트 메세지를 보내게 됩니다! 이렇게 봇 설정을 모두 끝냈습니다. 이제 본격적으로 에러 발생 시 에러 메세지를 보내보겠습니다. 우선 자신이 운용하는 Node js 또는 아직 Node js 프로젝트를 생성하지 않은 분들은 express-generator로 Node js 서버 구축하기! 글을 참고하여 프로젝트를 생성해 주시고 다음 단계를 보시면 될 거 같습니다.
Express 서버에 추가하기
저는 express-generator 로 만든 프로젝트를 기준으로 설명드리겠습니다. express-generaotr로 생성하지 않은 프로젝트도 적용 가능합니다.
app.js 파일로 이동하여 줍니다.
에러처리 헨들러로 가서 아래의 코드를 추가해 주겠습니다.
const dayjs = require('dayjs');
const request = require('request');
const
botKey = "my bot token",
clientId = "my client id",
day = dayjs().format('YYYY년 MM월 DD일 HH시 mm분 ss초'),
res_ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress,
error_text = "[내 프로젝트 이름] [ERROR] "+ res_ip + "에서 "+ day + "에 해당 오류가 발생하였습니다. \n\n" + res.locals.message;
request(`https://api.telegram.org/bot${botKey}/sendmessage?chat_id=${clientId}&text=${encodeURI(error_text)}`,
function (error, response, body) {
if(!error){
if(response.statusCode === 200){ console.log("에러 전송 성공") }
} else { console.error("요청 전송을 실패하였습니다.") }
});
위처럼 코드를 작성해 주시고 자신의 봇 토큰과 클라이언트 아이디를 넣으신 다음에 서버를 재부팅 해 주면 적용이 완료됩니다!
(해당 코드를 적용 후 request 모듈과 dayjs 모듈이 설치되 있어야 정상적으로 작동됩니다. 만약 모듈이 설치되어있지 않으면 npm i request –save , npm i dayjs –save 이 2개의 명령어를 입력하여 모듈 설치를 완료해 주시면 됩니다.)
404 오류를 생성 후 정상적으로 메세지가 날라가는 것을 볼 수 있습니다.
텔레그램으로 서버 오류가 잘 넘어옵니다! 이렇게 오류 메세지를 텔레그램으로 전송하는 방법을 알아봤습니다. 다음에는 어떠한 이유로 텔레그램 메세지를 보내지 못하였을때 이메일 주소로 에러 메세지를 보내는 방법에 대해서 소개하겠습니다.
긴 글 읽어주셔서 감사합니다.