Twiggy est un projet à un stade précoce pour construire un paquet de journalisation plus Pythonic. Utilisation: Rendre le travail d'affichage: >>> import sys; sys.stderr = sys.stdout La configuration est simple Dans votre main.py: >>> Twiggy d'importation >>> Twiggy.quick_setup () Messages de journalisation >>> From twiggy import * Interface principale est le journal magique: >>> Connecter #doctest: + ELLIPSIS Il fonctionne hors de la boîte, en utilisant différents niveaux de qualité: >>> Log.debug («Vous ne pouvez pas prendre soin») DEBUG: Vous ne pouvez pas prendre soin >>> Log.error («OMFG! Pantalon en feu!») Erreur: OMFG! Pantalons en feu! Il prend en charge une variété de chaînes de format, par défaut nouveau style: >>> Log.info ('je porte {0} sur mon {} où »,« pantalon », où =« jambes ») INFO: Je porte un pantalon sur mes jambes Old style fonctionne bien mais: >>> Log.options (style = 'pour cent). Info ("Je veux% s», «tulipes») INFO: I like vélos Comme faire des modèles: >>> Log.options (style = 'dollar'). Info ("$ ce kill ', ce qui =' Cars ') INFO: La voiture tue Vous pouvez nommer vos enregistreurs: >>> Mylog = log.name ('alfredo') >>> Mylog.debug («bonjour») DEBUG: alfredo: bonjour Mais le nom n'a aucun rapport avec l'objet; il est juste à usage humain: >>> Mylog est log.name ('alfredo') Faux émission de messages Les émetteurs sont faiblement couplés: >>> Twiggy.emitters #doctest: + ELLIPSIS {'*': } Vous pouvez définir une min_level sur les émetteurs: >>> twiggy.emitters ['*']. min_level = twiggy.Levels.INFO >>> Log.debug ("Aide, aide je être supprimée») >>> Log.info ("Je ne suis pas encore mort») INFO: Je ne suis pas tout à fait encore mort Vous pouvez filtrer sur les expressions rationnelles, ou avec des fonctions arbitraires: >>> twiggy.emitters ['*']. filter = ". *. *" pantalon >>> Log.info ("Got my {0} sur», «pantalon») INFO: Got mon pantalon >>> Log.info ("Got my {0} sur", "chemise") Disons réinitialiser tout cela: >>> twiggy.emitters ['*']. filter = Vrai >>> twiggy.emitters ['*']. min_level = twiggy.Levels.DEBUG Mieux sortie Les nouvelles lignes sont supprimées par défaut; qui peut être désactivée par message: >>> Log.info ('user NINPUT nannoys nus ») INFO: user NINPUT nannoys nus >>> log.options (suppress_newlines = false) .info («nous ndeal ') INFO: nous affaire Des exceptions sont préfixés. Peut également passer exc_info. Utilisez ' n' comme préfixe à plier en une seule ligne: >>> Essai: ... 1/0 ... Sauf: ... Log.trace («erreur») avertissement («oh chutes de neige») #doctest:. + ELLIPSIS AVERTISSEMENT: oh chutes de neige TRACE d'enquête (le plus récent appel de dernière): fichier de trace "", la ligne 2, en TRACE 1/0 TRACE ZeroDivisionError: division entière par zéro ou modulo Méthode chaînage Je aime ce style enchaîné un lot. >>> Log.name ('Benito'). Info ("salut là») INFO: Benito: salut il Il rend journal structuré facile: >>> log.fields (chemins = 42) .info («Faire une promenade ') INFO: chemins = 42: Faire une promenade Coupe courte. Idéal pour les statistiques d'exécution rassemblement. >>> Log.struct (chemins = 42, dauphins = 'reconnaissants') INFO: dauphins = reconnaissants: chemins = 42: Liaison partielle peut être utile pour webapps: >>> Per_request_log = log.fields (request_id = '12345') >>> Per_request_log.fields (lignes = 100, user = 'frank'). Info ("frobnicating base de données ') INFO: request_id = 12345: lignes = 100: mode = franche: base de données frobnicating >>> per_request_log.fields (octets = 5678) .info ('envoyer la page sur les tubes') INFO: octets = 5678: request_id = 12345: envoyer la page sur les tubes Le style Enchaîné est impressionnant: >>> ('Sexy' pantalons =). Renseignements champs de log.name ('donjuan'). ("Bonjour, {} qui veulent {} ce?", Qui = «dames», ce qui = 'danse') INFO: Donjuan: pantalons = sexy: bonjour, mesdames veulent danser? Dynamique! Toutes les fonctions dans args / champs sont appelés et la valeur substitué: >>> import os >>> From twiggy.lib importation thread_name >>> Thread_name () 'MainThread' >>> log.fields (pid = os.getpid) .info («Je suis en fil {0}", thread_name) #doctest: + ELLIPSIS INFO: pid = 1076: Je suis en fil MainThread Cela peut être utile avec les bûcherons partiellement liés, qui nous allons nous faisons des trucs cool: >>> ThreadTracker de classe (objet): ... Def __init __ (self, obj): ... Self .__ obj = obj ... # Un enregistreur partiellement lié ... Self .__ log = log.name («tracker»). Champs (obj_id = id (obj), thread = thread_name) ... Self .__ log.debug ("a commencé à suivre») ... __getattr Def __ (self, attr): ... Self .__ log.debug ("consultée {0}", attr) ... Retour getattr (self .__ obj, attr) ... >>> Classe Bunch (objet): ... Passer ... >>> Foo = Bunch () >>> Foo.bar = 42 >>> Suivis = ThreadTracker (foo) DEBUG: Tracker: obj_id = 14063980: thread = MainThread: a commencé à suivre >>> Tracked.bar DEBUG: Tracker: obj_id = 14063980: thread = MainThread: bar consultée 42 >>> Filetage d'importation >>> T = threading.Thread (target = lambda: tracked.bar * 2, name = "TheDoubler") >>> T.start () DEBUG: Tracker: obj_id = 14063980: thread = TheDoubler: bar consultée Si vous voulez vraiment vous déconnecter un appelable, repr () ou l'envelopper dans lambda. Optimisations Comme une optimisation, une min_level peut être réglé sur les enregistreurs: >>> Mylog.min_level = twiggy.Levels.INFO >>> Mylog.info ("Vous voyez cette") INFO: alfredo: Vous voyez ce >>> Mylog.debug ("Ceci est caché") Ils prennent également un filtre qui fonctionne sur format_spec. Le cas d'utilisation est efficacement ferme pas des messages spécifiques dans une bibliothèque qui est en train de faire quelque chose de stupide: >>> Mylog.filter = lambda s: "magouilles" pas dans s >>> Mylog.info («Démarrage bêtise») INFO: alfredo: bêtise partir >>> For i in xrange (3): # pour les grandes valeurs de 3 ... Mylog.info («Je appellent magouilles!") >>> Mylog.info ("End bêtise») INFO: alfredo: bêtise de fin
Exigences :
11 May 15
Commentaires non trouvées