2011-01-18 20 views
12

J'ai trois classes en python et elles s'exécutent dans des threads différents. Je voudrais avoir sortie dans le même fichier de toutes les classes. À l'heure actuelle, j'ai créé une méthode de sortie dans la classe principale et je l'ai transmise à d'autres classes via des constructeurs. Y at-il moyen de mieux le gérer? Comment puis-je passer l'enregistreur entre les classes, sauf en utilisant des contructeurs?Connexion entre classes en python

Peut-être python supporte quelque chose comme la méthode statique en Java, donc je peux écrire comme Logger.info (message) dans les trois classes?

Une autre façon pourrait probablement réaffecterons sys.stdout mondiale au fichier, i.e. spécifiant

logger = open('debug.txt', 'w') 
sys.stdout = logger 

Ensuite, en utilisant des appels sys.stdout dans toutes les classes.

Qu'en pensez-vous?

Répondre

23
import logging 
log = logging.getLogger("mylog") 
log.setLevel(logging.DEBUG) 

formatter = logging.Formatter(
    "%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s") 
# Alternative formatting available on python 3.2+: 
# formatter = logging.Formatter(
#  "{asctime} {threadName:>11} {levelname} {message}", style='{') 

# Log to file 
filehandler = logging.FileHandler("debug.txt", "w") 
filehandler.setLevel(logging.DEBUG) 
filehandler.setFormatter(formatter) 
log.addHandler(filehandler) 

# Log to stdout too 
streamhandler = logging.StreamHandler() 
streamhandler.setLevel(logging.INFO) 
streamhandler.setFormatter(formatter) 
log.addHandler(streamhandler) 

# Test it 
log.debug("Some message") 
log.error("An error!") 
try: 
    something() 
except: 
    log.exception("An exception occured!") 

Ne manquez pas l'debug.txt:

 
2011-01-18 12:07:24,943 MainThread DEBUG  Some message 
2011-01-18 12:07:24,943 MainThread ERROR  An error! 
2011-01-18 12:07:24,943 MainThread ERROR  An exception occured! 
Traceback (most recent call last): 
    File "./logtest.py", line 17, in 
    something() 
NameError: name 'something' is not defined 

Notez que l'ordre dans lequel les messages apparaissent dans le fichier journal peut ne pas correspondre exactement à l'ordre dans lequel ils se sont produits lorsque vous vous connectez de plusieurs threads.

+1

@lazyr. Merci pour la réponse. Comment je peux passer l'objet de journal entre les classes de sorte que tous les trois fichiers et il écrira dans le même fichier journal? – yart

+1

J'ai le code ci-dessus dans un fichier séparé, disons log.py, puis je vais "à partir de log journal d'importation" dans chacun de mes autres modules. Python ne charge qu'un module une seule fois - toutes les instructions d'importation après la première ne font que récupérer ce qui a déjà été chargé - donc ce sera le même objet de journal dans tous vos threads. –

+4

@lazyr: Dans le cas du module 'logging', vous n'avez pas besoin de faire cela - le module' logging' conserve lui-même les loggers qu'il crée dans son propre module. Vous pouvez simplement lancer 'logging.getLogger' dans un autre module et vous obtiendrez le même objet. – nosklo