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 기반 완전 자가 운영 가능
  • 가볍고 안정적

이 글이 도움이 되었나요?좋아요/추천은 다시 누르면 취소됩니다.
hong
발행: 2026.02.13 최종 검토: 2026.02.13

답글 남기기

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