我有一个包含多个组件的包,这些组件将从使用日志记录和输出有用信息中受益匪浅。
我不想做的是为每个单独的文件“设置”正确的日志记录:
import logging
logging.basicConfig(level=DEBUG)
my_function = logging.getLogger("my_function")
my_class = logging.getLogger("my_class")
我尝试了几种方法,其中之一是将样板代码添加到实用程序模块中的类中,然后尝试执行如下操作:
from util import setlogging
set_logging()
但即使是上述解决方案在我看来也不干净,并且会导致问题,因为 setLogger 没有 __call__
方法。我真正喜欢的是我的“set_logging”类将从配置文件中读取并具有一些默认值,因此无论我想要什么级别或什么类型的日志记录格式都可以正确设置它。
有没有办法在我的包中全面初始化正确的日志记录?也许在 __init__.py
文件中?
为了尽可能详细,这就是 setlogging(现在是一个函数,而不是一个类)的样子:
def setlogging(config=None):
if config == None:
config = config_options() # sets default values
levels = {
'debug': DEBUG,
'info': INFO
}
level = levels.get(config['log_level'])
log_format = config['log_format']
datefmt = config['log_datefmt']
basicConfig(
level = level,
format = log_format,
datefmt = datefmt)
最佳答案
如果您希望包的各个模块中的所有代码都使用相同的记录器对象,您只需要(使该记录器可用——稍后查看——并且)调用
mylogger.warning("Attenzione!")
之类的,而不是 logging.warning
&c。因此,问题简化为为整个包创建一个 mylogger
对象,并使其在包中的所有模块中都可用。 (或者,您可以使用命名记录器,其名称以包名称开头,后跟一个点,但虽然这是 logging
包功能的重要组成部分,但我个人从来没有发现它是一种自然的方式运行)。
因此,您的 util.setlogging
函数后面可以简单地跟上,比如说,
mylogger = logging.getLogger(package_name)
并且每个导入 util
的模块都可以简单地使用
util.mylogger.warning('Watch out!')
之类的。在我看来,这似乎是最简单的方法,只要包中的所有代码都应以相同方式登录的概念适用即可。
关于python - 跨包模块设置日志记录的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3348958/