1

我正在用 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 库,而是使用过滤器来允许对日志消息进行单点控制。

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

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

4

1 回答 1

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() 以及从什么时候开始方法知道用户想要什么日志记录级别。

您可以在程序开始时的配置步骤中设置日志记录级别。你可以使用基于字典的配置,一个执行一系列 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...)

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

于 2013-08-19T23:31:24.800 回答