登录Python。处理程序和控制台重复

时间:2014-07-02 20:29:19

标签: python logging

我有一个简单的日志记录设置:

def main()

  # ....
  # Create logger
  logging.basicConfig(filemode='w', level=logging.DEBUG)
  logger = logging.getLogger(__name__)
  logger.setLevel(logging.DEBUG)

  # Create file handler for DEBUG and above
  fh1 = logging.FileHandler(__name__ + '.debug.log')
  fh1.setLevel(logging.DEBUG)

  # Create file handler for INFO and above
  fh2 = logging.FileHandler(__name__ + '.info.log')
  fh2.setLevel(logging.INFO)

  # Create console handler with INFO and above
  ch = logging.StreamHandler()
  ch.setLevel(logging.INFO)

  # Add all the handlers to the logger
  logger.addHandler(fh1)
  logger.addHandler(fh2)
  logger.addHandler(ch)
  # ....

然后我打电话

logger.info("this is an INFO message")
logger.debug("this is a DEBUG message")

我在控制台上获得以下内容:

this is an INFO message
INFO:__main__:this is an INFO message
this is a DEBUG message
DEBUG:__main__:this is a DEBUG message

即使我希望在控制台中只看到INFO消息(因为我在上面为logging.info指定了StreamHandler)。为什么我会得到这些副本?

我的.debug.loginfo.log个文件仅包含正确级别的邮件,但其格式不包含前缀INFO:__main__DEBUG:__main__。为什么他们的格式不同?

1 个答案:

答案 0 :(得分:2)

logging.basicConfig(filemode='w', level=logging.DEBUG)

创建StreamHandler。因此,您的代码创建了两个StreamHandlers,一个具有日志记录级别DEBUG,另一个具有级别INFO

basicConfig是一项便利功能。如果您想创建自己的处理程序,则无需调用basicConfig。 (或者您可以致电basicConfig并添加其他处理程序......)


如果您在调用basicConfig时未提供文件名,则会向根记录器添加StreamHandler。这是代码inside the basicConfig function

if handlers is None:
    filename = kwargs.get("filename")
    if filename:
        mode = kwargs.get("filemode", 'a')
        h = FileHandler(filename, mode)
    else:
        stream = kwargs.get("stream")
        h = StreamHandler(stream)