【问题标题】:Preferred method for controlled logging of Python debug messages?受控记录 Python 调试消息的首选方法?
【发布时间】:2013-08-21 20:58:30
【问题描述】:

我正在用 Python3 编写一个大型硬件仿真库。对于日志记录,我使用 Python3 Logging 模块。

为了以方法级别的粒度控制调试消息,我学会了“在大街上”(好的,在 StackOverflow 上)在我想要记录的每个方法中创建子记录器:

sub_logger = logging.getChild("new_sublogger_name")
sub_logger.setLevel(logging.DEBUG)

# Sample debug message
sub_logger.debug("This is a debug message...")

通过更改对 setLevel() 的调用,用户可以基于每个方法启用/禁用调试消息。

现在老板不喜欢这种方法。他提倡单点,在该点上,可以使用相同的方法级粒度启用/禁用库中的所有日志消息。 (这是通过编写我们自己的 Python 日志库 BTW 来实现的)。

不想重新发明日志轮,我建议继续使用 Python Logging 库,而是使用过滤器来允许对日志消息进行单点控制。

没有经常使用 Python Logging Filters,对于这个应用程序使用 Filters 和 Sublogger.setLevel() 是否有共识?每种方法的优缺点是什么?

在使用了一段时间后,我已经习惯了 setLevel(),但这可能会影响我的客观性。但是,我不希望浪费每个人的时间来编写另一个 Python 日志库。

【问题讨论】:

标签: python debugging logging python-3.x


【解决方案1】:

我认为现有的日志记录模块可以满足您的需求。诀窍是将调用 setLevel()(配置操作)的位置与调用 getChild()(正在进行的日志记录操作)的位置分开。

import logging

logger = logging.getLogger('mod1')

def fctn1():
    logger.getChild('fctn1').debug('I am chatty')
    # do stuff (notice, no setLevel)

def fctn2():
    logger.getChild('fctn2').debug('I am even more chatty')
    # do stuff (notice, no setLevel)

注意那里没有 setLevel(),这是有道理的。为什么每次都调用 setLevel() 方法是什么时候知道用户想要什么日志级别。

您在程序开始时的配置步骤中设置日志记录级别。您可以使用dictionary based configuration 来完成此操作,这是一个执行一系列 setLevel() 调用的 python 模块,甚至是您使用 ini 文件或其他任何东西制作的东西。但基本上归结为:

def config_logger():
    logging.getLogger('abc.def').setLevel(logging.INFO)
    logging.getLogger('mod1').setLevel(logging.WARN)
    logging.getLogger('mod1.fctn1').setLeveL(logging.DEBUG)
    (etc...)

现在,如果您想使用过滤器,您可以使用它们来检查堆栈帧并为您提取方法名称。但这变得更加复杂。

【讨论】:

  • 感谢您的想法。我会看看我是否可以轻松地将它集成到我当前的系统中。谢谢!
  • 我已经尝试过这种方法,但我看到的缺点是我必须在 config_logger() 中为每个记录器专门设置级别。我怎么能说:“除非您在 config_logger() 中特别启用,否则请保持安静?
  • @JS - 日志级别是继承的。您在根目录添加的内容会影响所有记录器,除非它们被覆盖。通常,您在 a.b 设置的内容会影响 个子级(a.b.c、a.b.c.d 等...)。 logging.getLogger('').setLevel(logging.FATAL) 保持低调。
  • 宾果游戏!这就是我一直缺少的方面!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多