Aller au contenu principal

Traitement des données de journal

Traitez un script de journal comme un petit pipeline de données :

octets → enregistrements décodés → champs analysés → événements validés → agrégation → sortie

Définissez le sort des enregistrements mal formés à chaque frontière. Les ignorer silencieusement rend les conclusions opérationnelles peu fiables.

Diffuser et analyser

Parcourez l'entrée plutôt que de charger un journal sans borne en mémoire. Préférez un format structuré documenté comme JSON Lines. Pour un ancien format texte fixe, utilisez un motif compilé avec champs nommés. Voici la version JSON Lines :

import json
from collections import Counter
from pathlib import Path

counts: Counter[str] = Counter()
bad_records = 0

with Path("events.jsonl").open("r", encoding="utf-8") as handle:
for line_number, line in enumerate(handle, start=1):
try:
event = json.loads(line)
user = event["user"]
if not isinstance(user, str) or not user:
raise ValueError("invalid user")
except (json.JSONDecodeError, KeyError, ValueError, TypeError):
bad_records += 1
continue
counts[user] += 1

La politique peut échouer immédiatement, mettre les mauvais enregistrements en quarantaine ou continuer avec un compteur. Choisissez selon que les résultats incomplets restent significatifs et exposez le nombre de rejets dans la sortie ou les métriques.

Frontières opérationnelles

  • Les journaux peuvent tourner, être tronqués, arriver dans le désordre, se répéter ou finir par un enregistrement partiel.
  • Les horodatages exigent format et fuseau explicites. Convertissez-les en datetime conscients du fuseau pour les comparaisons entre systèmes.
  • Noms d'utilisateur, chemins et messages peuvent être sensibles. Minimisez, expurgez et contrôlez la rétention à l'ingestion plutôt qu'après copie.
  • L'analyse par expression régulière encode un schéma même sans fichier de schéma. Versionnez et testez ce contrat si les producteurs peuvent changer.
  • Une agrégation exacte conserve une clé par valeur distincte. Les clés à cardinalité élevée ou sans borne exigent limites, stockage externe ou algorithmes approximatifs.

Pour un lot unique, produisez une sortie déterministe, telle qu'un JSON ou CSV trié. Pour un traitement continu, ajoutez des points de reprise ou une stratégie d'idempotence afin qu'un redémarrage ne recompte pas. Un simple décalage de fichier peut devenir invalide après rotation.

Produire des journaux

Les modules doivent obtenir logging.getLogger(__name__) ; le point d'entrée configure gestionnaires et format. Les journaux lus par des machines doivent porter des champs stables plutôt que forcer les outils ultérieurs à retrouver une structure dans une phrase humaine.

Les journaux sont des preuves, pas la vérité absolue. Consignez version de l'analyseur, portée d'entrée, nombre de rejets et durée de traitement lorsque le résultat éclaire une décision opérationnelle ou de sécurité.

Un lot borné exécutable

Le code ci-dessus analyse du JSON Lines, pas le format historique à expressions régulières. Enregistrez ces quatre lignes dans events.jsonl dans un répertoire temporaire, puis exécutez l'exemple :

{"user": "ada"}
{"user": "ada"}
{"user": "grace"}
{"user": ""}

Ajoutez après la boucle cette sortie des résultats et rejets :

print(json.dumps({"counts": dict(counts), "bad_records": bad_records}, sort_keys=True))

Le résultat est {"bad_records": 1, "counts": {"ada": 2, "grace": 1}}. Un JSON valide n'est pas forcément un événement valide : null, [], un champ user absent ou numérique sont également rejetés. json.loads lève JSONDecodeError, sous-classe de ValueError, pour un JSON invalide.

Cet exemple compte les échecs d'analyse et de schéma, mais arrête le lot en cas d'erreur d'accès au fichier ou de décodage UTF-8. Le décodage se produit lors de l'avancement de l'itérateur de fichier, hors du try interne. Le traitement en flux conserve environ une ligne d'entrée, sans limite fixe en octets : un enregistrement énorme exige encore une politique de taille. Le Counter croît aussi avec le nombre d'utilisateurs distincts.

Sources

Explorer les liens

Cette note n’a pas encore de liens vers d’autres notes.

Sur les mêmes sujets (46)

Ouvrir le réseau