Как создать приложение для уведомления об ошибках в реальном времени с помощью Python

Вы когда-нибудь хотели быть в курсе критических событий или ошибок, не проверяя постоянно журналы?

В этом руководстве я покажу вам, как создать программу на Python, которая отслеживает файлы журналов в режиме реального времени и уведомляет вас по электронной почте о возникновении определенных событий. К концу этого руководства у вас будет практичный инструмент, который отслеживает проблемы и немедленно отправляет вам оповещения.

Этот проект предназначен для начинающих и демонстрирует, как использовать библиотеки Python для мониторинга файлов и автоматизации электронной почты. Давайте начнем!

Зачем создавать систему мониторинга ошибок?

Система мониторинга журналов - отличный проект на Python, позволяющий улучшить ваши навыки при решении реальных задач. Вот чему вы научитесь:

- Использование библиотеки watchdog для отслеживания изменений файлов.- Использование smtplib для отправки уведомлений по электронной почте.- Настройка обработки событий с помощью переопределяющих методов в классе ООП.

Лучшая часть? Этот проект полезен системным администраторам, разработчикам или всем, кому необходимо отслеживать логи на предмет ошибок или критических событий в режиме реального времени.

Это также отличный способ расширить свое портфолио за счет проекта, который имеет практическое значение для выполнения реальных задач на Python.

Давайте погрузимся в это с головой!

Предварительные условия проекта

Прежде чем мы начнем программировать, давайте рассмотрим навыки и инструменты, необходимые для этого руководства.

Не волнуйтесь, если вы еще не являетесь экспертом в области Python! Знание нескольких базовых принципов сделает это путешествие более плавным и приятным.

Базовые знания Python

Вы должны быть знакомы с:

- Переменные, функции и циклы.- Основы работы с файлами и обработка исключений.

Необходимые библиотеки

Мы будем использовать следующие библиотеки Python:

- watchdog для мониторинга файлов в режиме реального времени.- smtplib для отправки электронных писем.

Если у вас еще не установлен watchdog, просто запустите эту команду:

pip install watchdog

Любознательный и склонный к экспериментам ум

На мой взгляд, экспериментирование и внесение небольших изменений - это один из ключей к обучению программированию. Так что будьте готовы к изучению и отладке по мере продвижения вперед!

Шаг 1: Настройка Вашего Проекта

Прежде чем мы начнем кодировать, давайте настроим проект:

1. Убедитесь, что на вашем компьютере установлен Python. Если нет, загрузите его с официального сайта Python.2. Откройте свой любимый редактор кода или IDE.3. Создайте новый файл Python, например, log_monitor.py.

Шаг 2: Импортируйте необходимые библиотеки

Давайте начнем с импорта библиотек, которые мы будем использовать в этом проекте:

import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

Объяснение:

- watchdog предоставляет инструменты для отслеживания изменений в файлах.- библиотеки smtplib и электронной почты помогают отправлять уведомления по электронной почте.

Шаг 3: Создайте систему уведомлений по электронной почте

Далее мы определим функцию для отправки оповещений по электронной почте при возникновении определенных событий:

# Email Configuration
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL_ADDRESS = "your_email@gmail.com"
EMAIL_PASSWORD = "your_password"
RECIPIENT_EMAIL = "recipient_email@gmail.com"

def send_email(subject, body):
    try:
        msg = MIMEMultipart()
        msg['From'] = EMAIL_ADDRESS
        msg['To'] = RECIPIENT_EMAIL
        msg['Subject'] = subject
        msg.attach(MIMEText(body, 'plain'))

        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.starttls()
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.send_message(msg)
        server.quit()
        print(f"Email sent: {subject}")
    except Exception as e:
        print(f"Failed to send email: {e}")

Для этого приложения я решил использовать Gmail в качестве почтового клиента, но, конечно, не стесняйтесь использовать то, что вам больше нравится.

Тем не менее, если вы хотите подписаться на меня и пользоваться Gmail, вам необходимо выполнить несколько дополнительных шагов, чтобы ваше приложение на Python получило доступ к вашей учетной записи Gmail.

  • Войдите в свою учетную запись Google и перейдите на страницу своей учетной записи Google по адресу https://myaccount.google.com
  • Нажмите на опцию "Безопасность" в левом меню
  • Нажмите на кнопку "Двухэтапная проверка".
  • Включите "двухэтапную проверку" любым удобным для вас способом
  • Оставайтесь на странице "Двухэтапная проверка" и прокрутите страницу вниз до раздела "Пароли приложений"
  • Нажмите на "Пароли приложений".
  • Введите название вашего приложения - это может быть "Автоматическое уведомление журнала ошибок".
  • Нажмите "Создать"€ затем сохраните этот пароль

Теперь вы можете использовать этот пароль приложения в качестве значения для своей переменной EMAIL_PASSWORD, чтобы без проблем получить доступ к своей учетной записи Gmail!

Ключевые моменты:- убедитесь, что вы настроили пароль для Gmail, используя указанные действия.- Замените заполнители учетные данные Gmail.Ã' 

Шаг 4: Отслеживание файла журнала

Мы создадим класс, который наследуется от FileSystemEventHandler, чтобы отслеживать изменения в файлах и обнаруживать определенные события.

class LogFileHandler(FileSystemEventHandler):
    def __init__(self, keywords, file_path):
        self.keywords = keywords
        self.file_path = file_path

    def on_modified(self, event):
        if event.src_path == self.file_path:
            with open(self.file_path, 'r') as file:
                lines = file.readlines()
                for line in lines[-10:]:  # Check only the last 10 lines
                    for keyword in self.keywords:
                        if keyword in line:
                            subject = f"Alert: {keyword} detected"
                            body = f"Keyword '{keyword}' detected in log:\n\n{line}"
                            send_email(subject, body)

Как это работает: - Класс LogFileHandler наследуется от FileSystemEventHandler.- Мы переопределяем метод on_modified, чтобы указать действия при изменении отслеживаемого файла.- Программа проверяет последние 10 строк файла журнала на наличие определенных ключевых слов.

Шаг 5: Запустите программу мониторинга

Наконец, мы настроим основную функцию для инициализации наблюдателя и запуска мониторинга:

if __name__ == "__main__":
    path_to_watch = "mylog.log"  # Replace with your log file
    keywords_to_watch = ["ERROR", "CRITICAL", "500 Internal Server Error"]

    event_handler = LogFileHandler(keywords_to_watch, path_to_watch)
    observer = Observer()
    observer.schedule(event_handler, path=path_to_watch, recursive=False)

    print("Monitoring started...")
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Ключевые моменты: - Наблюдатель отслеживает изменения в файле журнала.- Когда файл журнала изменяется, запускается метод on_modified в LogFileHandler.

Полный исходный код программы

Вот полный исходный код для системы мониторинга журналов и уведомлений:

'''
Hackr.io Python Tutorial: Log Notification System
'''
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# Email Configuration
SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL_ADDRESS = "your_email@gmail.com"
EMAIL_PASSWORD = "your_password"
RECIPIENT_EMAIL = "recipient_email@gmail.com"
EMAIL_ADDRESS = "hackrvktesting@gmail.com"
EMAIL_PASSWORD = "clggpavydrnlsxsv"
RECIPIENT_EMAIL = "robert@venturekite.com"


# Function to send email


def send_email(subject, body):
    try:
        msg = MIMEMultipart()
        msg['From'] = EMAIL_ADDRESS
        msg['To'] = RECIPIENT_EMAIL
        msg['Subject'] = subject
        msg.attach(MIMEText(body, 'plain'))

        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.starttls()
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.send_message(msg)
        server.quit()
        print(f"Email sent: {subject}")
    except Exception as e:
        print(f"Failed to send email: {e}")

# Define Event Handler


class LogFileHandler(FileSystemEventHandler):
    def __init__(self, keywords, file_path):
        self.keywords = keywords
        self.file_path = file_path

    def on_modified(self, event):
        if event.src_path == self.file_path:
            with open(self.file_path, 'r') as file:
                lines = file.readlines()
                for line in lines[-10:]:  # Check only the last 10 lines for efficiency
                    for keyword in self.keywords:
                        if keyword in line:
                            subject = f"Alert: {keyword} detected"
                            body = f"Keyword '{keyword}' detected in log:\n\n{line}"
                            send_email(subject, body)


# Main Function
if __name__ == "__main__":
    path_to_watch = "logs/mylog.log"  # Replace with your log file
    keywords_to_watch = ["ERROR", "CRITICAL", "500 Internal Server Error"]

    event_handler = LogFileHandler(keywords_to_watch, path_to_watch)
    observer = Observer()
    observer.schedule(event_handler, path=path_to_watch, recursive=False)

    print("Monitoring started...")
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Сворачивание

Поздравляю! Вы только что создали систему мониторинга журналов и уведомлений на Python. Эта программа демонстрирует, как Python может автоматизировать реальные задачи, используя такие библиотеки, как watchdog и smtplib.

Не стесняйтесь расширять этот проект за счет:

- Мониторинг нескольких файлов.- Добавлена поддержка SMS-уведомлений или Slack-уведомлений.- Регистрация обнаруженных событий для последующего анализа.

Счастливого кодирования!