如何使用日志记录模块将Python的unittest模块错误回溯重定向到日志文件?

时间:2018-06-29 13:09:32

标签: python python-2.7 logging python-unittest

我有一个python测试脚本,我试图将其输出(stdout和stderr)都重定向到控制台和日志文件。该脚本在控制台中生成我想要的以下输出。

test_valid_timerange (testapp.TestApp) ... FAIL
test_has_dashboard_description (testapp.TestApp) ... ok

======================================================================
FAIL: test_valid_timerange (testapp.TestApp)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/himanshu/git/content/test/testapp.py", line 135, in test_valid_timerange
    "%s: panel %s in dashboard %s does not use relative url" % (self.appname, dash.get("name"), panel.get("name")))
AssertionError: Kubernetes: panel Kubernetes - Kube-System in dashboard Pod and Container Running in Kube-System does not use relative url

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

但是在日志文件中,我只能得到这个。

2018-06-29 18:29:56,289 [MainThread  ] [INFO ]  Starting Tests for manifestfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.manifest.json appfile: /Users/himanshu/git/content/src/main/app-package/kubernetes/kops/kubernetes.json
2018-06-29 18:29:56,341 [MainThread  ] [INFO ]  testing Kubernetes: test_valid_timerange
2018-06-29 18:29:56,341 [MainThread  ] [INFO ]  testing Kubernetes: test_has_dashboard_description
2018-06-29 18:29:56,342 [MainThread  ] [DEBUG]  Results - Total TestCases: 2 Total Failed: 1

我知道一种方法是从测试结果对象中明确获取失败和错误,并使用仅将处理程序输出到文件的记录器打印出来(这是因为如果我使用当前的记录器,它既具有流处理程序又具有文件处理程序它将在控制台中打印两次失败消息)。这是我当前的代码

def get_logger():
    log = logging.getLogger(__name__)
    if not log.handlers:

        log.setLevel(logging.DEBUG)
        logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")

        consoleHandler = logging.StreamHandler(sys.stdout)
        consoleHandler.setFormatter(logFormatter)
        log.addHandler(consoleHandler)

        filehandler = RotatingFileHandler(LOGFILE, maxBytes=(1024*1024*25), backupCount=7)
        filehandler.setFormatter(logFormatter)
        log.addHandler(filehandler)

    return log

logger = get_logger()
suite = unittest.TestSuite()
// using suite.addTest to add tests and using logger in each test function
result = unittest.TextTestRunner().run(suite)

是否有其他更好的方法,而无需使用单个处理程序创建另一个记录器?我正在寻找替代方法,例如在创建测试套件时传递记录器(unittest.TestSuite(logger = mylogger))或使用相同的记录器,但显式传递参数以使用特定的处理程序(logger.info(msg,using = filehandler))或通过传递一些参数来停止向控制台打印失败的消息,我可以使用我的自定义记录器将其打印到控制台和文件。

1 个答案:

答案 0 :(得分:0)

我使用了类似于here

的内容
class LoggerWriter:
    def __init__(self, logger):
        self.logger = logger

    def write(self, message):
        if message != '\n' and message != " ... ":
            self.logger.debug(message)

    def flush(self):
        pass

suite = unittest.TestSuite()
result = unittest.TextTestRunner(stream=LoggerWriter(logger), verbosity=3).run(suite)

P.S。我仍然不知道这是否是解决问题的最佳方法。