python - 我应该使用日志模块还是日志类?

标签 python python-3.x logging

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

#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

最佳答案

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

logger = logging.getLogger(__name__)

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

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

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

注意 - NullHandler是Python2.7新增的,之前的版本需要自己实现。

关于python - 我应该使用日志模块还是日志类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34940302/

相关文章:

python - 'utf- 8' codec can' t 编码字符 '\udcc2' : surrogates not allowed

python - 使用python如何同时对多个文件执行此代码?

python - Python 的内置 __build_class__ 有什么作用?

python-3.x - PyQt 或 PySide : QTextEdit deselect all

java - Spring Boot 和日志记录

php - 如何防止 CodeIgniters 打印 PHP 错误

python - 在 Os.Rename 中强制覆盖

python - K-2 交叉验证本质上等于 50 的训练测试分割 :50?

python - 是否可以通过 Python 使用 Cocoa API?

logging - 将多个 AppHarbor 应用程序与现有 Logentries 帐户集成