Système d’analyse de logs en quasi temps réel avec suivi de fichier et agrégations sur fenêtres temporelles

Système Python d’analyse de logs en quasi temps réel avec suivi de fichier, agrégations temporelles et threading pour une analyse performante et évolutive.

Brève Introduction

Système d’analyse de logs en quasi temps réel avec suivi de fichier et agrégations sur fenêtres temporelles (python)
DESCRIPTION :
Ce système en Python permet de surveiller en quasi temps réel un fichier de log, en effectuant le suivi (tailing) des nouvelles lignes ajoutées et en agrégeant les données sur des fenêtres temporelles glissantes. Il utilise le threading pour la lecture asynchrone et pandas pour les agrégations, fournissant une analyse robuste et configurable.

NOTES SUPPLÉMENTAIRES :
Le système est conçu pour être facilement extensible à différents formats de logs et métriques d'agrégation. Il est robuste face à la rotation du fichier de log si le fichier est remplacé, mais dans ce cas le processus doit être redémarré. Le tailing est implémenté sans dépendances externes pour une portabilité maximale.

EXPLICATIONS :
- La fonction tail_log_file() surveille le fichier de log dans un thread séparé, ne lisant que les nouvelles lignes ajoutées.
- Le parsing des lignes de log extrait le timestamp et le niveau de log pour pouvoir filtrer et agréger correctement les données.
- La structure de données 'log_entries' conserve uniquement les événements de la fenêtre temporelle actuelle, supprimant les plus anciens pour optimiser la mémoire et les calculs.
- La fonction aggregate_and_print() s'exécute périodiquement pour calculer et afficher le nombre d'événements par niveau de log dans la fenêtre actuelle.
- L'utilisation du threading permet de ne pas bloquer le thread principal et d'avoir un système réactif et évolutif.
- L'utilisation de pandas facilite les opérations de filtrage et d'agrégation temporelle, rendant le code plus lisible et performant.

Code d'Exemple : python

import threading
import time
import re
from datetime import datetime, timedelta
import pandas as pd

# Configurations
LOG_FILE_PATH = 'app.log'  # Chemin du fichier de log à surveiller
WINDOW_SIZE_SEC = 60       # Durée de la fenêtre temporelle en secondes
AGGREGATION_INTERVAL_SEC = 10  # Intervalle de mise à jour de l'agrégation

# Regex pour le parsing des lignes de log : exemple de format '[2024-06-01 12:00:00] [INFO] Message'
LOG_LINE_REGEX = re.compile(r'\[(?P<timestamp>[^\]]+)\]\s+\[(?P<level>DEBUG|INFO|WARN|ERROR)\]\s+(?P<message>.*)')

# Format du timestamp dans le log
TIMESTAMP_FORMAT = '%Y-%m-%d %H:%M:%S'

# Buffer pour stocker les lignes de log parsées sous forme de dictionnaires
log_entries = []

# Verrou pour synchroniser l'accès à log_entries
log_lock = threading.Lock()


def tail_log_file(file_path):
    """
    Fonction qui effectue le tailing non bloquant du fichier de log.
    Lit uniquement les nouvelles lignes ajoutées au fichier.
    """
    with open(file_path, 'r', encoding='utf-8') as f:
        # Se positionner à la fin du fichier
        f.seek(0, 2)
        while True:
            line = f.readline()
            if not line:
                # Pas de nouvelle ligne, attendre un peu
                time.sleep(0.1)
                continue
            # Parsing de la ligne
            m = LOG_LINE_REGEX.match(line.strip())
            if m:
                try:
                    timestamp_str = m.group('timestamp')
                    level = m.group('level')
                    message = m.group('message')
                    timestamp = datetime.strptime(timestamp_str, TIMESTAMP_FORMAT)
                    entry = {'timestamp': timestamp, 'level': level, 'message': message}
                    # Ajout thread-safe
                    with log_lock:
                        log_entries.append(entry)
                except Exception as e:
                    # Ignorer les lignes mal formées
                    print(f'Erreur de parsing de ligne de log : {e}')
            else:
                # Ligne non conforme au format attendu
                print(f'Ligne de log non conforme : {line.strip()}')


def aggregate_and_print():
    """
    Fonction qui agrège périodiquement les données dans la fenêtre temporelle actuelle
    et affiche les statistiques.
    """
    while True:
        time.sleep(AGGREGATION_INTERVAL_SEC)
        now = datetime.now()
        window_start = now - timedelta(seconds=WINDOW_SIZE_SEC)

        with log_lock:
            # Filtrer uniquement les événements dans la fenêtre temporelle
            recent_entries = [e for e in log_entries if e['timestamp'] >= window_start]
            # Mettre à jour le buffer en conservant uniquement les événements récents
            log_entries[:] = recent_entries

        if not recent_entries:
            print(f'[{now.strftime(TIMESTAMP_FORMAT)}] Aucun événement dans la fenêtre temporelle.')
            continue

        # Création du DataFrame pour l'agrégation
        df = pd.DataFrame(recent_entries)

        # Comptage des événements par niveau
        counts = df['level'].value_counts().to_dict()

        # Affichage des statistiques
        print(f'[{now.strftime(TIMESTAMP_FORMAT)}] Statistiques des {WINDOW_SIZE_SEC} dernières secondes :')
        for level in ['DEBUG', 'INFO', 'WARN', 'ERROR']:
            count = counts.get(level, 0)
            print(f'  {level} : {count}')
        print('-' * 40)


def main():
    # Démarrage du thread pour le tailing du log
    tail_thread = threading.Thread(target=tail_log_file, args=(LOG_FILE_PATH,), daemon=True)
    tail_thread.start()

    # Démarrage de l'agrégation périodique
    aggregate_and_print()


if __name__ == '__main__':
    main()
×
×
×
Veux-tu régénérer la réponse ?
×
Exporter le chat
Choisissez le format d'export
⏳ Generazione PDF in corso…
Allegati
×
⚠️ Vous êtes sur le point de fermer le chat et de passer au générateur d’images. Si vous n’êtes pas connecté, vous perdrez notre conversation. Confirmez-vous ?
👁 Tu consultes une discussion partagée en mode temporaire. Elle ne sera pas enregistrée.
💬
×
Prompts enregistrés
×
Note privée
×
Étiquette
×
Rechercher dans toutes les discussions
×
Vos insights
Analyse en cours…
×
Préférences IA
Nom de l'assistant 30
Longueur des réponses
Modèle IA
Réponses structurées
Inclure des exemples
Utiliser des emojis
Guide-moi, ne résous pas Des indices et des questions plutôt que la réponse toute faite
Plus de réglages →
×
Partager cette discussion
Toute personne ouvrant ce lien pourra consulter la discussion ou l'ajouter à son profil comme discussion personnelle.
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
Discussion partagée
Quelqu'un a partagé une discussion avec toi. Veux-tu seulement la consulter ou l'ajouter à tes discussions ?
⚠️ Attention : les pièces jointes de la discussion seront également partagées. Qui l'ajoutera recevra une copie des fichiers dans son dossier.
×

📌 Messages enregistrés

Chargement...

×

Historique des discussions

programmes-exemples · HISTORIQUE DU CHAT

Chargement...

Préférences IA

×
  • 🟢 BasiqueRéponses rapides et essentielles pour étudier
  • 🔵 MoyenQualité supérieure pour étude et programmation
  • 🟣 AvancéRaisonnement complexe et analyses détaillées
Expliquer les étapes

Qu'est-ce qu'il faut ?

Fichier de log texte (ex. /var/log/app.log) à surveiller

Module Python 'threading' pour effectuer le tailing en arrière-plan

Module Python 'time' pour la gestion temporelle et le sleep

Module Python 'pandas' pour les agrégations et la gestion des fenêtres temporelles

Configuration du chemin du fichier de log à surveiller (variable LOG_FILE_PATH)

Configuration de la durée de la fenêtre temporelle en secondes (variable WINDOW_SIZE_SEC)

Configuration de l'intervalle de mise à jour de l'agrégation (variable AGGREGATION_INTERVAL_SEC)

Parsing des lignes de log basé sur regex pour extraire le timestamp et le niveau de log (DEBUG, INFO, WARN, ERROR)

Gestion du descripteur de fichier avec seek et read pour implémenter le tailing sans relire tout le fichier

Buffer circulaire en mémoire pour ne conserver que les données de la fenêtre temporelle actuelle

Sortie périodique des statistiques d'agrégation (nombre d'événements par niveau de log)

Dépendance : pandas (installable via pip avec 'pip install pandas')

Compatibilité : Python 3.7+

Configuration optionnelle pour formats de timestamp personnalisés dans le log

Sujets Similaires

Calcul de la vitesse moyenne donné distance et temps
Script Python simple pour calculer la vitesse moyenne à partir de la distance et du temps avec gestion des entrées utilisateur et affichage précis.
Calcul du temps nécessaire pour lire un livre donné le nombre de pages et pages/heure
Script Python pour calculer le temps de lecture d’un livre selon le nombre de pages et la vitesse en pages par heure, avec affichage en heures et minutes.
Calcul du temps restant jusqu’à minuit donné l’heure actuelle
Script Python pour calculer le temps restant jusqu’à minuit à partir de l’heure actuelle avec affichage en heures minutes et secondes.
Convertisseur de temps du format HH:MM en minutes totales et inversement
Script Python pour convertir le temps entre format HHMM et minutes totales avec gestion d’erreurs et utilisation en ligne de commande simple et efficace.
Analyseur de fichiers journaux avec comptage des erreurs par type et par date
Script Python pour analyser les fichiers journaux en comptant les erreurs par type et date, avec filtrage des niveaux ERROR et CRITICAL pour un rapport détaillé
Analyseur de fichiers de configuration INI avec lecture et modification des paramètres
Analyseur Python simple pour lire, modifier et sauvegarder les fichiers INI avec gestion des sections et clés, idéal pour configurations d’applications.
Analyseur de texte qui calcule la fréquence des mots et génère un classement
Script Python pour analyser un texte, calculer la fréquence des mots en ignorant la ponctuation et la casse, et générer un classement des mots fréquents.
Simulateur de file d’attente (queue) de clients avec temps de service aléatoires
Simulateur Python de file d’attente clients avec temps de service aléatoires en FIFO. Visualisez l’état de la file à chaque étape pour comprendre la gestion des