Python 中日志记录和防御性编程的缺点
介绍
要了解并深入了解防御性编程的理论,请查看本系列的第一篇指南。
日志记录
日志记录的使用方式与断言语句类似。它可以提供运行时调试信息,并可能改进可执行文档。尽管日志记录并不完全像断言。但它有一些额外的好处。
1. 增加控制粒度
2. 更加动态的控制
日志记录允许您从几乎任何地方读取日志级别。一些常见位置是配置文件、环境变量或数据库。这种灵活性允许您控制看到的日志信息量,而无需重新运行或重新分发应用程序。
相比之下,Python 不允许您动态地为断言语句分配调试常量。因此,您无法在不重新运行应用程序的情况下打开或关闭断言。
在决定防御性编码策略时,这一点值得考虑。如果您使用PyInstaller之类的“替代”分发机制,动态日志控制尤其重要。
3. 默默保存回溯
发生故障时拥有回溯和调试信息很有用,并且智能日志记录使用几乎可以自动为您完成这些操作。
Doug Hellman在一篇出色的异常处理文章中演示了这个概念:
```python
def main():
logging.basicConfig(level=logging.WARNING)
log = logging.getLogger('example')
try:
throws()
return 0
except Exception, err:
log.exception('Error from throws():')
return 1
```
log.exception的调用会自动为我们添加异常信息。然后,我们可以配置记录器,将回溯和异常放入单独的日志文件中,以供以后检查,而无需保留所有正常信息和警告。
如果在生产代码中启用,此异常文件可能包含出色的调试信息。这为挖掘这些日志数据开辟了许多令人兴奋的可能性:
- 发现用户正在尝试我们从未测试过甚至考虑过的功能的不同排列,这可能会导致添加新功能以使常见用例更容易。
- 查找由于用户对应用程序工作方式的误解而导致的常见错误,从而有助于编写更好的用户文档。
4. 使用断言进行高级组合
您还可以将断言与日志记录结合使用。例如,您可以在默认调试模式下运行应用程序,然后捕获AssertionError并将其记录到另一个文件中。这可以带来更多数据挖掘可能性,例如找出您对所运行平台的环境假设。
这些只是防御性编程环境中日志的一些用途。事实上,您可以使用日志来为各种问题创建低保真解决方案,这又是另一篇文章的主题了。
您甚至可以使用日志记录来构建自己的分析工具。每次使用功能时登录网络或 Dropbox 文件。然后,每次都让 shell 脚本跟在您后面并收集这些文件。现在,您拥有大量以简单文本格式呈现的使用信息,为数据挖掘和帮助用户开辟了大量可能性。
请记住,大多数用户不会填写调查问卷。因此,这是一种收集有关他们尝试使用的功能或常见工作流程的信息的方法。然后,您可以在未来的版本中改进这些功能。
日志记录的缺点
日志记录有许多与断言相同的缺点。但是,日志记录的额外灵活性也带来了需要考虑的额外负担。
1. 难以维持一致的水平
日志记录最困难的部分是在整个代码库中一致地使用可用的级别集。这归结为命名的主观问题,这是计算机科学中仅有的两个问题之一。最好的解决方案是在样式指南中与代码一起提交指南。然后,有一些项目特定的文档供新手在添加日志消息时参考。
2. 多记录器的设计
结论
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~