【问题标题】:python logging and handler usagepython日志记录和处理程序使用
【发布时间】:2013-04-09 16:46:19
【问题描述】:

我正在尝试了解 python 日志记录的工作方式。

我知道它是一个适用于整个正在运行的解释器的单例实例。

我有这个功能:

def setup_logging(options=None):
  '''setup the logger and return it'''
  logging.basicConfig(level=logging.WARNING,
                      format='%(levelname)s: %(message)s',
                      filename='/tmp/pluser.log')

  logger =  logging.getLogger('pluser')
  console = logging.StreamHandler()
  console.setLevel(logging.DEBUG)
  print(console.level)
  logger.addHandler(console)
  return logger

我用这个称呼:

  console = setup_logging(options)

  console.debug('Initializing database')
  connect_to_db()
  console.debug('Database initialized')

(这是为在不同的地方进行更多的日志记录做准备。)

现在,“console”是一个“logging.Logger”实例。 它有一个 StreamHandler。该流处理程序的级别为 10(即 logging.DEBUG)。 但是,StreamHandler 似乎没有收到消息,因为事情只会在 console.warning、error 或 critical 时打印到控制台(上面应该有 stderr 和 stdout)。

所以,我显然遗漏了记录器与系统或 StreamHandler 交互的方式。

我的目标是当 StreamHandler 的级别是调试时,所有内容都打印到控制台,但我也想了解为什么这不起作用。

【问题讨论】:

  • 我添加了“logging.StreamHandler(sys.stdout),然后如果我做console.warning,它会连续打印3次,但在调试时仍然不打印。

标签: python logging


【解决方案1】:

好的,这里已经回答了这个问题:logging setLevel, how it works

总结一下:您添加处理程序的记录器需要处于您的处理程序或更低级别,否则记录器会在消息传递给处理程序之前拒绝消息。

所以我必须将我的 basicConfig 默认设置为 DEBUG,而不是 WARNING。如果我想添加另一个只处理 WARNING 及以上的处理程序,我会这样做,而不是让它保持默认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多