小编典典

记录,StreamHandler和标准流

python

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


阅读 173

收藏
2020-12-20

共1个答案

小编典典

以下脚本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.

2020-12-20