我应该使用日志模块还是日志记录类?

时间:2016-01-22 06:24:44

标签: python python-3.x logging

我用很多模块编写大程序。在同一模块中我希望使用日志记录。登录Python的最佳实践是什么? 我应该使用import standart日志记录模块并在我的每个文件中使用它:

#proxy_control.py
#!/usr/bin/env python3

import logging


class ProxyClass():

    def check_proxy():
        pass
        logging.basicConfig(filename='proxy.log', level=logging.INFO)
        logging.info('Proxy work fine')

或者我应该编写一个继承自默认日志记录的MyLog()类并从其他所有模块中使用它?

#proxy_control.py
#!/usr/bin/env python3

import MyLog


class ProxyClass():

    def check_proxy():
        pass
        Mylog.send_log('Proxy work fine')


#my_log.py
#!/usr/env/bin python3

import logging


class MyLog():
     def send_log(value):
         pass

2 个答案:

答案 0 :(得分:5)

典型的惯例是在每个需要记录的模块的顶部定义一个记录器,然后在整个模块中使用该记录器对象。

logger = logging.getLogger(__name__)

这样,记录器将遵循您的包名称(即package.subpackage.module)。这在日志记录模块中很有用,因为记录器会根据记录器名称向上传播消息(即。parent.child会将消息传递到parent)。这意味着您可以在顶级记录器中执行所有配置,它将从包中的所有子记录器获取消息。或者,如果其他人正在使用您的库,他们将很容易配置从库中获取哪些日志消息,因为它将具有一致的命名空间。

对于库,除非用户明确启用它们,否则通常不希望显示日志记录消息。除非您设置处理程序,否则Python日志记录将自动登录到stderr,因此您应该向顶级记录器添加NullHandler。这样可以防止消息自动打印到stderr。

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

注意 - 在Python2.7中添加了NullHandler,对于早期版本,您必须自己实现它。

答案 1 :(得分:1)

使用日志记录模块,并将日志记录配置保留到应用程序的入口点(模块不应自行配置日志记录)。