记录,StreamHandler和标准流

发布于 2021-01-29 19:35:25

我不知道如何将信息级别的消息记录到stdout,但将其他所有内容记录到stderr。我已经阅读了http://docs.python.org/library/logging.html。有什么建议吗?

关注者
0
被浏览
40
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    以下脚本log1.py

    import logging, sys
    
    class SingleLevelFilter(logging.Filter):
        def __init__(self, passlevel, reject):
            self.passlevel = passlevel
            self.reject = reject
    
        def filter(self, record):
            if self.reject:
                return (record.levelno != self.passlevel)
            else:
                return (record.levelno == self.passlevel)
    
    h1 = logging.StreamHandler(sys.stdout)
    f1 = SingleLevelFilter(logging.INFO, False)
    h1.addFilter(f1)
    rootLogger = logging.getLogger()
    rootLogger.addHandler(h1)
    h2 = logging.StreamHandler(sys.stderr)
    f2 = SingleLevelFilter(logging.INFO, True)
    h2.addFilter(f2)
    rootLogger.addHandler(h2)
    logger = logging.getLogger("my.logger")
    logger.setLevel(logging.DEBUG)
    logger.debug("A DEBUG message")
    logger.info("An INFO message")
    logger.warning("A WARNING message")
    logger.error("An ERROR message")
    logger.critical("A CRITICAL message")
    

    运行时,产生以下结果。

    C:\ temp> log1.py
    调试消息
    INFO消息
    警告消息
    错误消息
    关键信息
    

    正如你所期望的,因为在终端上sys.stdout,并sys.stderr是相同的。现在,让我们将标准输出重定向到文件tmp

    C:\ temp> log1.py> tmp
    调试消息
    警告消息
    错误消息
    关键信息
    

    因此,INFO消息没有被打印到终端-但指示消息sys.stderr 被打印。让我们看一下其中的内容tmp

    C:\ temp>输入tmp
    INFO消息
    

    So that approach appears to do what you want.



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看