使用twisted.python.log的代码出现Twisted trial错误

时间:2015-07-27 23:02:23

标签: python logging twisted

我似乎无法登录到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)没有直接相似之处。

1 个答案:

答案 0 :(得分:1)

这里的部分问题是a bug that has already been fixed in Twisted,其中包含警告字符串的格式。

然而,真正的问题是你开始记录两次,一次是运行trial,它设置自己的日志观察者来捕获记录的异常,一次是在模块范围内调用startLogging。如果你使用the new API for doing this,你会收到类似的错误,所以切换到twisted.logger,虽然从长远来看是一个好主意但并不真正相关。

正确的解决方案通常是不开始自己记录;让twistdtrial为您完成。如果您确实需要自己启动它,它应该在main函数的上下文中,该函数仅在例如trial之外的“真实”启动程序时运行。