Python으로 장애 감지 시스템 만들기 (실전 구성)
📌 왜 로그 자동 알림이 필요할까?
서버는 보통 이렇게 망가집니다.
- CPU가 천천히 올라감
- 디스크가 가득 참
- nginx에서 500 에러 증가
- 특정 서비스가 반복적으로 죽음
그런데 문제는,
대부분 “나중에” 알게 됩니다.
그래서 필요한 것이 바로
👉 로그를 자동 분석하다가 이상 징후가 나오면 즉시 알림 전송
이번 글에서는:
- Python으로 로그 실시간 감시
- 에러 패턴 발견 시
- Synology Chat으로 자동 알림 전송
구성을 완성합니다.
🧠 전체 구조
[서버 로그 파일]
↓
[Python 프로그램이 실시간 감시]
↓
[에러 패턴 발견]
↓
[Synology Chat Webhook 전송]
↓
[채널에 알림 도착]
🛠 1단계: 시놀로지 챗 Webhook 생성
① Synology Chat 접속
② 우측 상단 프로필 → 통합(Integration)
③ “Incoming Webhooks” 생성
④ 채널 선택
⑤ 생성된 Webhook URL 복사
URL 예시:
https://NAS주소:5001/webapi/entry.cgi?api=SYNO.Chat.External&method=incoming&version=2&token=토큰값
이 URL을 Python 코드에 붙여 넣습니다.
🧩 2단계: Python 로그 감시 프로그램
파일명 예:
log_watch_to_synochat.py
📜 전체 코드 (실전용)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import time
import json
import re
import hashlib
from datetime import datetime
import requests
# ====== 설정 ======
SYNCHAT_WEBHOOK_URL = "여기에_웹훅_URL_입력"
LOG_FILES = [
"/var/log/syslog",
# "/var/log/nginx/error.log",
]
ERROR_PATTERNS = [
r"\bERROR\b",
r"\bCRITICAL\b",
r"\bFATAL\b",
r"Exception",
r"\b5\d\d\b"
]
DEDUP_WINDOW_SEC = 300
VERIFY_SSL = True
# ===================
def send_synology_chat(text):
payload_obj = {"text": text}
data = {"payload": json.dumps(payload_obj, ensure_ascii=False)}
response = requests.post(
SYNCHAT_WEBHOOK_URL,
data=data,
timeout=10,
verify=VERIFY_SSL
)
response.raise_for_status()
def tail_follow(path):
with open(path, "r", encoding="utf-8", errors="replace") as f:
f.seek(0, os.SEEK_END)
while True:
line = f.readline()
if not line:
time.sleep(0.2)
continue
yield line.strip()
def main():
compiled_patterns = [re.compile(p, re.IGNORECASE) for p in ERROR_PATTERNS]
last_sent = {}
watchers = [(path, tail_follow(path)) for path in LOG_FILES]
while True:
for path, generator in watchers:
try:
line = next(generator)
except StopIteration:
continue
for pattern in compiled_patterns:
if pattern.search(line):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
message = f"🚨 서버 로그 에러 감지\n시간: {now}\n파일: {path}\n내용: {line}"
key = hashlib.sha1(message.encode()).hexdigest()
if key not in last_sent or time.time() - last_sent[key] > DEDUP_WINDOW_SEC:
try:
send_synology_chat(message)
last_sent[key] = time.time()
print("전송 완료:", message)
except Exception as e:
print("전송 실패:", e)
time.sleep(0.05)
if __name__ == "__main__":
main()
🚀 3단계: 실행 방법
1️⃣ requests 설치
pip3 install requests
2️⃣ 실행
python3 log_watch_to_synochat.py
※ /var/log 접근은 root 권한이 필요할 수 있습니다.
🔄 4단계: systemd로 자동 실행 설정
운영 환경이라면 백그라운드 실행이 필요합니다.
서비스 파일 생성:
sudo nano /etc/systemd/system/logwatch.service
내용:
[Unit]
Description=Log Watch to Synology Chat
After=network.target
[Service]
ExecStart=/usr/bin/python3 /경로/log_watch_to_synochat.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target
활성화:
sudo systemctl daemon-reload
sudo systemctl enable logwatch
sudo systemctl start logwatch
⚙ 실무 업그레이드 아이디어
✔ 5분 동안 에러 10회 이상일 때만 전송
✔ 에러 유형별로 메시지 구분
✔ 최근 10줄 로그 묶어서 전송
✔ Docker 로그 감시 추가
✔ nginx 전용 패턴 구성
🎯 실제 운영에서 얻는 효과
- 장애 발생 즉시 인지
- 새벽 시간 장애 대응 가능
- 로그 확인 시간 단축
- 운영 신뢰도 상승
📋 체크리스트
✔ Webhook 생성 완료
✔ Python 실행 성공
✔ 에러 발생 시 Chat 알림 수신
✔ 중복 알림 방지 정상 동작
✔ systemd 등록 완료
🔥 이 구성의 핵심 장점
- 비용 0원
- 외부 SaaS 불필요
- NAS 기반 완전 자가 운영 가능
- 가볍고 안정적
이 글이 도움이 되었나요?좋아요/추천은 다시 누르면 취소됩니다.