콘텐츠로 건너뛰기
Codex

실패한 자동화 작업에서 텔레그램 알림 보내기

실패한 자동화 작업에서 텔레그램 알림 보내기

TECH NOTE · AUTOMATION OPS

자동화 작업이 실패했을 때 텔레그램으로 알림을 보내는 최소 구성과, 알림에 담아야 할 맥락을 정리했습니다.

실패 알림은 짧고 다시 손댈 수 있어야 한다

실패한 자동화 작업에서 텔레그램으로 보내야 하는 건 긴 로그가 아니다. 내 경우에는 “무슨 작업이 실패했는지”, “어디까지 갔는지”, “다음에 어디를 보면 되는지” 이 세 가지만 있어야 다시 앉아서 바로 이어갈 수 있었다.

처음엔 그냥 에러 로그를 통째로 보내면 되겠다고 생각했다. 그런데 막상 받아보면 텔레그램 방 안에서 로그는 너무 길고, 정작 필요한 줄은 묻힌다. 알림은 디버깅 화면이 아니라 호출벨에 가깝다. 보고 “아, 저 작업이 저 지점에서 죽었구나” 정도만 바로 알면 된다.

메시지에는 실패 원인보다 위치를 먼저 넣는다

실패 원인은 틀릴 수 있다. 스크립트가 뱉은 에러 한 줄만 보고 원인을 단정하면 오히려 돌아간다. 대신 실패한 위치를 정확히 적어두면 나중에 로그를 다시 열 때 시간이 덜 샌다.

내가 넣고 싶었던 항목은 대충 이 정도였다.

항목 왜 넣는가 예시
작업 이름 여러 자동화가 있을 때 구분하려고 content-pipeline
실행 단계 어디까지 성공했는지 보려고 publish
실패 시각 예약 작업이면 같은 실패가 반복됐는지 보려고 2026-07-26 03:00
커밋 또는 버전 코드가 바뀐 뒤 생긴 문제인지 보려고 66f728c
로그 위치 텔레그램에서 다 보지 않고 원본을 열려고 logs/publish.log
다음 행동 나중의 내가 바로 움직이게 하려고 로그 마지막 50줄 확인

메시지 예시는 이런 느낌이면 충분하다.

[실패] content-pipeline / publish
시각: 2026-07-26 03:00
위치: blog/content-pipeline
버전: 66f728c
로그: logs/publish.log
다음: 로그 마지막 50줄부터 확인

여기서 욕심내서 원인 추정까지 길게 붙이면 알림이 점점 리포트처럼 변한다. 텔레그램 알림은 리포트가 아니었다. 실패를 발견하고, 다시 들어갈 문을 알려주는 정도가 딱 맞았다.

컨텍스트 값은 스크립트 안에서 만들 수 있는 것만 쓴다

자동화 알림에 넣을 값은 사람이 기억해서 적는 게 아니라, 스크립트가 그 자리에서 뽑을 수 있어야 한다. 그래야 실패했을 때도 같은 형식으로 남는다.

Git 저장소 안에서라면 이런 값부터 확인할 수 있다.

pwd
git rev-parse --short HEAD
date +%Y-%m-%dT%H:%M:%S%z

pwd는 작업이 어느 폴더에서 돌았는지 보여준다. 은근히 중요하다. 자동화는 내가 생각한 폴더가 아니라 다른 경로에서 돌고 있는 경우가 있다.

git rev-parse --short HEAD는 현재 커밋을 짧게 찍는다. 실패가 코드 변경 때문인지, 외부 상태 때문인지 가를 때 첫 단서가 된다.

date는 실패 시각이다. 예약 작업이 새벽에 여러 번 돌면 “언제 죽었는지”가 생각보다 빨리 헷갈린다.

텔레그램에는 토큰보다 메시지 설계를 먼저 붙잡는다

텔레그램으로 보내려면 봇 토큰과 채팅방 ID가 필요하다. 이건 별도로 만들어서 환경 변수나 비밀값 저장소에 넣으면 된다. 다만 처음부터 토큰 설정에만 매달리면 정작 알림 내용이 빈약해진다.

내 경우에는 발송 성공보다 메시지 형식이 먼저였다. 알림이 와도 “실패함” 한 줄뿐이면 결국 서버에 들어가서 처음부터 다 뒤져야 한다. 그러면 알림을 붙인 의미가 별로 없다.

좋은 실패 알림은 이런 식으로 읽힌다.

아, publish 단계에서 죽었네.
현재 커밋은 66f728c네.
로그는 logs/publish.log 보면 되겠네.

이 정도면 충분하다. 텔레그램 안에서 문제를 다 해결하려고 하지 않아도 된다.

실패한 뒤에만 보내야 알림을 믿게 된다

성공 알림까지 매번 보내면 처음엔 뿌듯한데 금방 안 보게 된다. 자동화가 자주 돈다면 더 그렇다. 텔레그램 방이 초록색 성공 메시지로 차기 시작하면, 진짜 실패도 그냥 지나친다.

그래서 실패 알림만 보내는 쪽이 낫다. 성공 여부는 로그나 대시보드에서 보면 되고, 텔레그램은 사람이 봐야 할 때만 울리는 편이 좋았다.

조건은 단순하다.

상황 알림
정상 종료 보내지 않음
실패 종료 한 번만 보냄
재시도 후 성공 필요하면 마지막 상태만 보냄
같은 실패 반복 중복을 줄일 방법을 따로 둠

여기서 헷갈렸던 건 “재시도 중인 실패”였다. 한 번 실패하고 바로 재시도하는 구조라면, 첫 실패마다 알림을 보내면 너무 시끄럽다. 최종 실패가 확정됐을 때만 보내는 편이 낫다.

로그 전문은 텔레그램에 넣지 않는다

로그는 원본 위치를 남기는 게 낫다. 텔레그램 메시지에 로그를 많이 넣으면 보기에도 별로고, 줄바꿈이나 특수문자 때문에 메시지가 깨질 때도 있다.

대신 마지막 에러 한두 줄 정도만 붙이는 건 괜찮다. 다만 그것도 보조 정보다. 핵심은 “원본 로그가 어디 있는지”다.

예를 들면 이런 식이다.

에러: build step exited with code 1
로그: logs/build-2026-07-26.log

처음엔 에러 전문을 다 보내고 싶었다. 그런데 길게 보낼수록 텔레그램은 디버깅 도구가 아니라 스팸처럼 느껴졌다. 알림은 짧게, 조사는 로그에서. 이 기준이 잡히고 나서야 메시지가 덜 지저분해졌다.

같이 나오는 질문

텔레그램 봇 토큰은 코드에 넣어도 되나?

넣지 않는 게 맞다. 로컬이면 환경 변수, CI면 secrets에 넣는다. 알림 코드는 공개되어도 되고, 토큰은 공개되면 안 된다.

성공 알림도 같이 보내야 하나?

처음 붙일 때는 보내보고 싶지만, 오래 쓰려면 실패 알림만 남기는 편이 낫다. 성공은 조용한 게 정상이다.

다음에 뭘 보면 좋나?

같은 실패가 반복될 때 중복 알림을 어떻게 줄일지 보면 된다. 실패 알림을 붙이고 나면, 그다음 문제는 대체로 “너무 안 오는 것”보다 “너무 많이 오는 것”이었다.

이 블로그 더 보기

이 블로그는 실제 프로젝트를 AI와 함께 굴리면서 남긴 기록입니다.

  • 새 글은 RSS로 받아볼 수 있습니다.
  • 시리즈 전체는 여기에 정리해 두었습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다