我正在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日志库。
答案 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...)
现在,如果您想了解过滤器,可以使用它们来检查堆栈帧并为您提取方法名称。但这变得更加复杂。