Maison développement back-end Tutoriel Python Journalisation Python simple - et une digression sur les dépendances, la confiance et le code copier/coller

Journalisation Python simple - et une digression sur les dépendances, la confiance et le code copier/coller

Dec 03, 2024 am 07:20 AM

Simple Python Logging - and a digression on dependencies, trust, and Copy/pasting code

Image d'en-tête (C) Tai Kedzierski

Aller à l'extrait

Ce message est opiniâtre.

La configuration du journal par défaut de Python n'est d'aucune utilité ; cela va à l'encontre de l'approche « piles incluses » à laquelle nous nous attendons.

À partir d'un message de journal utile, je veux savoir quand, quel niveau et quelles informations. Je le veux peut-être sur console, je le veux peut-être dans un fichier.

Cela devrait être simple - mais en Python, je me retrouve à chaque fois obligé de chercher comment créer un utilitaire de journalisation complet avec une gestion de fichiers et un formatage de chaîne personnalisés.

Cela devrait être aussi simple que logger = getLogger(), mais le comportement par défaut, pour une raison inconnue, est de fournir un formatage complètement inutile, et aucun raccourci pour une valeur par défaut raisonnable.

Cela ou je dois télécharger un paquet pip de provenance inconnue, avoir confiance qu'il n'a pas été détourné par son nom ou faire une exfiltration obscurcie. L'incident du panneau gauche de 2016 me vient à l'esprit, ainsi que l'attaque de détournement Revival de 2024 qui était essentiellement le même problème dans un système de pension différent.

En fait, tout dépôt d'utilisateur sans espace de noms est vulnérable à ceci : le npm de Node, le pip de Python, l'AUR d'Arch, le snap de Canonical... pour n'en nommer qu'une poignée qui permettent simplement aux utilisateurs de télécharger n'importe quoi. Même l'espace de noms n'est pas une garantie de confiance - j'ai rencontré des projets qui distribuent leurs logiciels via ces canaux, non pas via le nom du projet, mais via le surnom arbitraire d'un développeur, soulevant des doutes quant à l'authenticité du package. J'ai expliqué mon processus de réflexion sur la façon de décider de faire ou non confiance à une source dans un article précédent sur l'utilisation de la synchronisation dans un environnement de travail.

Les dépendances externes dans les dépôts contrôlés par l'utilisateur sont le diable et ne doivent être prises en compte que lorsque la solution à un problème est complexe. Et en général, les solutions simples devraient simplement exister directement dans la base de code - idéalement auto-écrites, mais parfois le problème juste se glisse dans l'espace "assez encombrant" pour qu'une dépendance semble à la fois raisonnable et dégueulasse.

La réponse : écrivez-le une fois, rangez-le dans un Github Gist ou dans votre propre dépôt d'"extraits utiles". Copiez et collez.

Copier Coller ? Euh!

Le "copier-coller" du code envoie probablement la sonnette d'alarme à tout codeur chevronné. "Ne vous répétez pas", "utilisez un gestionnaire de paquets", "écrivez une fois, mettez à jour partout". Ce sont de bons instincts à avoir, mais au cas par cas, il est également bon de savoir quand le copier-coller est préférable.

Dans ce cas, l'exigence est d'éviter les dépendances externes inutiles pour une solution simple à un besoin simple . Dans leftpad comme avec ce mini-logger, l'extrait de code requis est court et facile à comprendre ; ce n'est pas une perte de réimplémenter si nécessaire. Il est également sous licence appropriée (oui, il peut s'agir simplement d'un extrait de code ; il reste cependant recommandé de s'assurer que ce que vous copiez est bien autorisé. Méfiez-vous de la copie de blobs de code aléatoires.)

Extrait de mini-enregistreur

J'inclus ci-dessous un extrait de code pour un utilitaire de mini-enregistreur qui permet un seul appel avec une configuration minimale :

from minilog import SimpleLogger

LOG = SimpleLogger(name="mylog", level=SimpleLogger.INFO)

LOG.info("this is useful")
Copier après la connexion

Quelles impressions consoler :

2024-11-20 10:43:44,567 | INFO | mylog : this is useful
Copier après la connexion

Le code du mini-enregistreur

Copiez ceci dans un fichier minilogger.py dans votre projet. Tada - aucune dépendance externe n'est nécessaire. Laissé intact, il restera le même pour toujours. Pas de détournement de nom. Aucune injection dans la chaîne d’approvisionnement.

# For completeness:
# (C) Tai Kedzierski - Provided under MIT license. Go wild.

import logging

class SimpleLogger(logging.Logger):
    FORMAT_STRING = '%(asctime)s | %(levelname)s | %(name)s : %(message)s'
    ERROR = logging.ERROR
    WARN = logging.WARN
    INFO = logging.INFO
    DEBUG = logging.DEBUG

    def __init__(self, name="main", fmt_string=FORMAT_STRING, level=logging.WARNING, console=True, files=None):
        logging.Logger.__init__(self, name, level)
        formatter_obj = logging.Formatter(fmt_string)

        if files is None:
            files = []
        elif isinstance(files, str):
            files = [files]

        def _add_stream(handler:logging.Handler, **kwargs):
            handler = handler(**kwargs)
            handler.setLevel(level)
            handler.setFormatter(formatter_obj)
            self.addHandler(handler)

        if console is True:
            _add_stream(logging.StreamHandler, stream=sys.stdout)

        for filepath in files:
            _add_stream(logging.FileHandler, filename=filepath)
Copier après la connexion

La licence MIT vous permet essentiellement de "faire ce que vous voulez avec ça". Aucune condition attachée.

Nous y sommes. Un simple journal ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la belle soupe pour analyser HTML? Comment utiliser la belle soupe pour analyser HTML? Mar 10, 2025 pm 06:54 PM

Comment utiliser la belle soupe pour analyser HTML?

Comment télécharger des fichiers dans Python Comment télécharger des fichiers dans Python Mar 01, 2025 am 10:03 AM

Comment télécharger des fichiers dans Python

Filtrage d'image en python Filtrage d'image en python Mar 03, 2025 am 09:44 AM

Filtrage d'image en python

Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte Mar 05, 2025 am 09:58 AM

Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte

Comment travailler avec des documents PDF à l'aide de Python Comment travailler avec des documents PDF à l'aide de Python Mar 02, 2025 am 09:54 AM

Comment travailler avec des documents PDF à l'aide de Python

Comment se cacher en utilisant Redis dans les applications Django Comment se cacher en utilisant Redis dans les applications Django Mar 02, 2025 am 10:10 AM

Comment se cacher en utilisant Redis dans les applications Django

Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch? Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch? Mar 10, 2025 pm 06:52 PM

Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch?

Présentation de la boîte à outils en langage naturel (NLTK) Présentation de la boîte à outils en langage naturel (NLTK) Mar 01, 2025 am 10:05 AM

Présentation de la boîte à outils en langage naturel (NLTK)

See all articles