代码之家  ›  专栏  ›  技术社区  ›  Tobias Hermann

如何使用StreamHandler捕获记录器的stderr上的输出?

  •  2
  • Tobias Hermann  · 技术社区  · 6 年前

    import contextlib
    import io
    import logging
    
    std_out_capture = io.StringIO()
    with contextlib.redirect_stderr(std_out_capture):
        logging.error('Hi.')
    
    output = std_out_capture.getvalue()
    print(f'output: {output}')
    

    output: ERROR:root:Hi.
    

    但是,当使用 logging.basicConfig

    import contextlib
    import io
    import logging
    
    log_format = '[%(threadName)s] [%(levelname)s] %(message)s'
    logging.basicConfig(format=log_format)
    
    std_out_capture = io.StringIO()
    with contextlib.redirect_stderr(std_out_capture):
        logging.error('Hi.')
    
    output = std_out_capture.getvalue()
    print(f'output: {output}')
    

    output: 
    [MainThread] [ERROR] Hi.
    

    因此不再捕获输出。

    我猜这是因为

    logging.basicConfig(**kwargs):通过创建一个带有默认格式化程序的StreamHandler并将其添加到根日志记录器中,对日志系统进行基本配置。

    ( https://docs.python.org/3/library/logging.html#logging.basicConfig )

    StreamHandler 在单独的线程中工作,因此不会捕获其输出。

    对于单元测试,我无论如何都想捕获它。我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Darkonaut    6 年前

    您必须将日志配置拉入 with StreamHandler 已经用 stderr :

    import contextlib
    import io
    import logging
    
    std_out_capture = io.StringIO()
    with contextlib.redirect_stderr(std_out_capture):
        log_format = '[%(threadName)s] [%(levelname)s] %(message)s'
        logging.basicConfig(format=log_format)
        logging.error('Hi.')
    
    output = std_out_capture.getvalue()
    print(f'output: {output}')
    # output: [MainThread] [ERROR] Hi.