Python调试消息的受控日志记录的首选方法?

时间:2013-08-19 22:51:19

标签: python debugging logging python-3.x

我正在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(),用户可以基于每个方法启用/禁用调试消息。

现在Boss Man不喜欢这种方法。他主张单点,可以使用相同的方法级粒度启用/禁用库中的所有日志消息。 (这是通过编写我们自己的Python日志库BTW来完成的。)

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

如果没有经常使用Python日志过滤器,对于此应用程序使用Filters vs Sublogger.setLevel()是否有共识?每种方法的优缺点是什么?

在使用它一段时间之后我习惯了setLevel(),但这可能会使我的客观性变得明显。但是,我不想浪费每个人的时间来编写另一个Python日志库。

1 个答案:

答案 0 :(得分:4)

我认为现有的日志记录模块可以满足您的需求。诀窍是将调用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...)

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