我似乎无法登录到stdout并在同一段代码上运行试用版。
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
输出
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.
为什么这段代码失败了?看起来它试图开始记录两次?
我注意到twisted.python.log
已被twisted.logger
取代;它应该只是一个包装器。 Logger
类似乎与startLogging(stdout)
没有直接相似之处。
答案 0 :(得分:1)
这里的部分问题是a bug that has already been fixed in Twisted,其中包含警告字符串的格式。
然而,真正的问题是你开始记录两次,一次是运行trial
,它设置自己的日志观察者来捕获记录的异常,一次是在模块范围内调用startLogging
。如果你使用the new API for doing this,你会收到类似的错误,所以切换到twisted.logger
,虽然从长远来看是一个好主意但并不真正相关。
正确的解决方案通常是不开始自己记录;让twistd
或trial
为您完成。如果您确实需要自己启动它,它应该在main
函数的上下文中,该函数仅在例如trial
之外的“真实”启动程序时运行。