【发布时间】:2017-06-05 13:49:57
【问题描述】:
我可以使用 Python 的 unittest assertLogs 来检查日志消息的格式吗?
def test_log_format(self):
h.config_common_log(level=logging.DEBUG)
h.get_log().debug('outside context')
with self.assertLogs(level=logging.DEBUG) as a_log:
h.get_log().debug('my_message - incontext')
self.assertRegex(a_log.output[0], ':\d+:my_message') # This fails
# This shows the log data itself is correct, just the output message is wrong
print('a_log.ouput={}\ta_log={!s}'.format(a_log.output, a_log))
# This was added to learn varying the logger would help. It did not.
def get_log():
return logging.getLogger()
def config_common_log(level=logging.WARNING):
get_log().setLevel(level)
ch = logging.StreamHandler()
ch.setFormatter(logging.Formatter('%(module)s:%(funcName)s:%(lineno)s:%(message)s')) # Despite this format statement.
get_log().addHandler(ch)
让我感到困惑的是“外部上下文”日志消息包含行号,但“我的消息 - 上下文”日志消息显示默认格式。
我目前的假设是 assertLogs 只检查一个 StreamHandler 并且(相当合理地)它使用默认的 StreamHandler 及其默认的格式化程序 a_msg。要测试我的 Formatter 和 StreamHandlder,我需要另一种方法。
【问题讨论】:
-
是的,不幸的是,
assertLogs()周围没有自定义点,我们唯一能做的就是定义我们自己的版本,它返回一个派生类_AssertLogsContext... 丑陋... github.com/python/cpython/blob/master/Lib/unittest/case.py#L311 -
感谢您查看我的旧问题并确认我的印象。