2015-07-27 1 views
1

Je n'arrive pas à me connecter à stdout et à tester sur le même morceau de code.Erreur d'essai tordu sur le code qui utilise twisted.python.log

temp.py

from sys import stdout 
from twisted.python.log import startLogging 
startLogging(stdout) 

class Foo(object): 
    pass 

temp_test.py

from twisted.trial import unittest 
from temp import Foo 

class FooTestCase(unittest.TestCase): 
    pass 

sortie

2015-07-27 17:45:06-0400 [-] Log opened. 
2015-07-27 17:45:06-0400 [-] Unable to format event {'log_namespace': 'twisted.logger._global', 'log_level': <LogLevel=warn>, 'fileNow': '/Users/james/Dropbox/code/demo/server/venv/lib/python2.7/site-packages/twisted/python/log.py', 'format': '%(log_legacy)s', 'lineNow': 210, 'fileThen': '/Users/james/Dropbox/code/demo/server/venv/lib/python2.7/site-packages/twisted/python/log.py', 'log_source': None, 'system': '-', 'lineThen': 210, 'log_logger': <Logger 'twisted.logger._global'>, 'time': 1438033506.184351, 'log_format': 'Warning: primary log target selected twice at <{fileNow}:{lineNow}> - previously selected at <{fileThen:logThen}>. Remove one of the calls to beginLoggingTo.', 'message':(), 'log_time': 1438033506.184351}: Invalid conversion specification 
2015-07-27 17:45:06-0400 [-] Log opened. 

Pourquoi ce code échoue? On dirait qu'il essaie de se connecter deux fois?


J'ai remarqué que twisted.python.log a été remplacé par twisted.logger; ça devrait juste être un emballage autour de ça. La classe Logger ne semble pas avoir un analogue direct à startLogging(stdout) cependant.

Répondre

1

Une partie du problème ici est a bug that has already been fixed in Twisted, avec la mise en forme de la chaîne d'avertissement ici. Cependant, le vrai problème est que vous démarrez la journalisation deux fois, une fois en exécutant trial, qui configure ses propres observateurs de journal pour capturer les exceptions journalisées, et une fois en appelant startLogging à l'étendue du module. Vous obtiendrez une erreur similaire si vous avez utilisé the new API for doing this, donc passer à twisted.logger, alors qu'une bonne idée à long terme, n'est pas vraiment liée.

La bonne solution consiste généralement à ne pas commencer à vous connecter; laissez twistd ou trial le faire pour vous. Si vous avez besoin de le démarrer vous-même, il devrait être dans le contexte d'une fonction main qui est seulement exécutée au démarrage de votre programme "pour vrai", en dehors de trial, par exemple.