python 记录到标准输出和标准错误

python logs to both stdout and stderr

我正在使用 python 这样的日志记录:

logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log = logging.getLogger()

一切正常。唯一的问题是所有日志消息都打印到 stdout 和 stderr。 stdout 的格式符合我的预期。 stderr 只是在错误流中打印消息本身。

我看到 log.handlers 确实包含 2 个处理程序。删除 stderr 似乎没有效果。试过这样的事情:

for handler in log.handlers:
    if handler.stream and handler.stream.name == '<stderr>':
        log.handlers.remove(handler)

有什么办法解决这个问题吗?

您可以使用logging.StreamHandler()

像那样:

logging.basicConfig(handlers=[logging.StreamHandler()], level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log = logging.getLogger()

如果您还想达到那个特定级别,可以使用 stderr(仅错误或错误和警告)和其他标准输出。你可以像@crosswired 在这里建议的那样做一些事情:

logger = logging.getLogger("__name__")
logger.setLevel(logging.DEBUG)
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(format)

h1 = logging.StreamHandler(sys.stdout)
h1.setLevel(logging.DEBUG)
h1.addFilter(lambda record: record.levelno <= logging.INFO)
h1.setFormatter(formatter)

h2 = logging.StreamHandler()
h2.setLevel(logging.WARNING)
h2.setFormatter(formatter)
logger.addHandler(h1)
logger.addHandler(h2)
logger.info("info")
logger.error("error")

Python logging split between stdout and stderr