2011-04-13 2 views
3

Existe-t-il un moyen d'obtenir/de renvoyer le message d'un appel à logging.debug()?Capture/Retourne le message de sortie de la journalisation python

Merci

+1

Vous devriez nous dire quelque chose au sujet du contexte: Avez-vous écrit le code de journalisation vous-même ou voulez-vous intercepter des messages de journal d'un autre module/cadre/quelque chose? –

+0

salut das, La raison pour laquelle je demande est que je lance (en utilisant subprocess.Popen) un certain nombre de processus enfants (programmes C++) et créer un enregistreur python pour chacun. La sortie de chaque processus est enregistré dans chaque enregistreur de processus. Je voulais avoir un journal "maître", qui contient la sortie de chaque processus, de sorte que chaque entrée dans le journal principal contienne le nom de l'enregistreur de chaque processus comme un identifiant – mikip

Répondre

0

Eh bien, logging.debug écrit habituellement dans un fichier. vous pouvez lire ce fichier en utilisant la fonction open().

+0

Vous pouvez également omettre ".exe" pour Windows. Cela stockera toutes les sorties dans ce fichier txt. – khachik

+0

@khchik: J'ai détruit ma première réponse, parce que je me suis trompé de question –

+0

'logging.debug()' n'écrit dans un fichier que si vous le configurez. – ncoghlan

0

Peut-être remplacer logging.debug au démarrage?

import logging 
d = logging.debug 
def myDebug(*args): 
    print "I'm a spy", args 
    d(*args) 
logging.debug = myDebug 
+3

JAMAIS faire ceci. Il n'y a absolument aucune raison de modifier le module de journalisation, compte tenu de l'énorme niveau de configurabilité qu'il fournit nativement. – ncoghlan

4

Oui, fournissant un mécanisme permettant de saisir facilement et rediriger les détails des événements sans nécessiter aucune modification du code émission des événements est tout l'objet du module logging.

Tout ce que vous devez faire est d'inclure un appel approprié au logging.basicConfig() lorsque votre application démarre et vous pouvez envoyer des événements enregistrés où vous le souhaitez.

Le plus simple consiste à se connecter à stdout:

import logging 
import sys 
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 

Pour des options plus avancées, je vous suggère de vérifier la logging tutorial dans la documentation officielle.

Si vous souhaitez un accès programmé au message formaté au moment de l'appel ... alors le module logging est le mauvais outil pour le travail. Il est conçu pour émettre des événements, pas pour une utilisation comme alternative à l'appel direct str.format.

Pour le cas que vous décrivez dans votre commentaire, vous pouvez envisager une configuration hierarchical logging le long des lignes suivantes:

>>> import logging 
>>> import sys 
>>> logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) 
>>> master = logging.getLogger("master") 
>>> child1 = logging.getLogger("master.child1") 
>>> child2 = logging.getLogger("master.child2") 
>>> child1.debug("Event from child 1") 
DEBUG:master.child1:Event from child 1 
>>> child2.debug("Event from child 2") 
DEBUG:master.child2:Event from child 2 

Dans cette configuration, notez que je ne configuré un gestionnaire au niveau racine du hiérarchie (dans le cadre de l'appel basicConfig()). logging comprend la notation "parent.child" dans les noms des enregistreurs, de sorte qu'il passera tous les événements transmis aux enregistreurs enfants jusqu'à l'enregistreur maître, qui les transmet ensuite à l'enregistreur racine.

Vous pouvez ajouter des gestionnaires de journalisation supplémentaires aux niveaux master et child si nécessaire afin de rediriger la sortie où vous le souhaitez.

+0

merci ncoghlan.La raison pour laquelle je demande est que je lance (en utilisant subprocess.Popen) un certain nombre de processus enfants (programmes C++) et crée un enregistreur pour chacun. La sortie de chaque processus est enregistrée dans chaque enregistreur de processus. Je voulais avoir un journal "maître", qui contient la sortie de chaque processus, de sorte que chaque entrée dans le journal maître conatins le nom de l'enregistreur de chaque processus comme un identifiant – mikip

+0

Mis à jour ma réponse - les noms hiérarchiques de logger devraient faire exactement ce que vous re après. – ncoghlan

Questions connexes