Python:logging.streamhandler没有将日志发送到stdout

Aas*_*h P 17 python logging

我想使用python的StreamHandler日志处理程序.我试过的是,

import logging
import sys
mylogger = logging.getLogger("mylogger")
h1 = logging.StreamHandler(stream=sys.stdout)
h1.setLevel(logging.DEBUG)

mylogger.addHandler(h1)

# now trying to log with the created logger
mylogger.debug("abcd") # <no output>
mylogger.info("abcd") # <no output>
mylogger.warn("abcd") # abcd
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?或者做错了什么?为什么INFO和DEBUG级别日志不会出现在STDOUT上?

tam*_*gal 32

您必须设置记录器的级别,而不仅仅是处理程序的级别:

mylogger.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

这是一个很好的日志工作流图形,您可以看到记录器和处理程序检查日志级别:

http://docs.python.org/2/howto/logging.html#logging-flow

默认值logLevelWARNING,因此即使您将处理程序的级别设置为DEBUG,因此消息将无法通过,因为您的记录器会对其进行抑制(默认情况下也是如此WARNING).

顺便说一句,你可以做一些基本的格式Formatter:

import logging
import sys

mylogger = logging.getLogger("mylogger")

formatter = logging.Formatter('[%(levelname)s] %(message)s')

handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)
handler.setLevel(logging.DEBUG)

mylogger.addHandler(handler)
mylogger.setLevel(logging.DEBUG)

mylogger.debug("This is a debug message.")
mylogger.info("Some info message.")
mylogger.warning("A warning.")
Run Code Online (Sandbox Code Playgroud)

会给你输出

[DEBUG] This is a debug message.
[INFO] Some info message.
[WARNING] A warning.
Run Code Online (Sandbox Code Playgroud)

  • 不,这没有错,正如您在http://docs.python.org/2/howto/logging.html#logging-flow中看到的那样,记录器在检查级别后将日志记录调用传递给其处理程序.因此,如果记录器的级别设置为"WARN",并且"DEBUG"消息到达,则无法通过.如果消息通过,则记录器将其移交给处理程序,处理程序也具有日志记录类型"过滤器". (2认同)