python - 跨包模块设置日志记录的有效方法

标签 python logging module package

我有一个包含多个组件的包,这些组件将从使用日志记录和输出有用信息中受益匪浅。

我不想做的是为每个单独的文件“设置”正确的日志记录:

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/

相关文章:

ruby - 为什么不可能在 Ruby 中包含类?

Python 不工作 : ImportError: No module named 'logging'

python - 扩展 Jinja 的 {% trans %} 以使用 JavaScript 变量

python - 将字典中的部分数据添加到数据框中

java - 将来自 com.sun.mail 的使用 PrintStream 和 log4j 的事件记录到单独的文件中

c++ - 具有两个 getInstance() 方法的单例移交父指针?

hadoop - 在发送到S3之前,YARN应用程序日志在哪里存储在EMR中

performance - Fortran 模块性能

python - 列出程序不工作

python - 1045, "Access denied for user ' 用户名'@'NOT-local' (使用密码: YES)"