引言

logging 的基本用法网上很多,这里就不介绍了。在引入正文之前,先来看一个需求:

假设需要将某功能封装成类库供他人使用,如何处理类库中的日志?

数年前在一个 C# 开发的项目中,我用了这样的方法:定义一个 logging 基类,所有需要用到日志的类都继承这个基类,这个基类中定义一个 LogHandler 事件,该事件用于实现具体的记录日志动作,同时可以通过将类 A 的 LogHandler 委托挂到类 B 的 LogHandler 上,实现将两个类的日志信息添加到一起。

自从看了 python 中 logging 的实现方式,我发现我的做法真是弱爆了。

我在之前的博客 Python:logging.NullHandler 的使用 中介绍了 peewee 框架中的日志输出,简单来说就是 peewee 中定义了一个名为 peewee 的 Logger 并添加了一个 NullHandler ,调用者只需要为其添加具体的 Handler 就可以输出日志了,非常方便。

假设我们在主程序中也有一个 Logger ,调用 peewee 后,我想将两个日志输出到同一个日志文件中去。显然将两个日志的 FileHandler 指向同一个日志文件是不可取的,存在并发抢占文件的风险。当然我们也可以将主程序中的 Logger 名字定为 peewee ,但这不仅太 low 了,而且如果再调用一个库,其中也封装好了一个 Logger,就不好处理了。

树桩结构的 Logger

Logger 对象被设计为一个树形结构,它有一个 parent 属性。 logging 中定义了一个名为 root 的 Logger 作为所有 Logger 的根节点, root 的 parent 属性为 None 。 root 是全局的。

当调用

logging.getLogger(name=None)

得到一个 Logger 对象的时候,如果 name 为 None ,则返回根节点 root 。如果 name 中含有 . ,比如 name = 'a.b' ,这时如果已经存在了名为 a 的 Logger ,则 a.b 为 a 的子节点,如果不存在名为 a 的 Logger ,则 a.b 为 root 的子节点。

child logger在完成对日志消息的处理后,默认会将日志消息传递给与它的 parent logger 。因此,我们不必为一个应用程序中使用的所有 Logger 定义和配置 handlers ,只需要为一个顶层的 Logger 配置 handlers ,然后按照需要创建 child loggers 就可足够了。我们可以通过设置 Logger 的 propagate 属性设置为 False 来关闭这种传递机制。

什么意思呢,我们来看代码:

import logginglogA = logging.getLogger('a')logA.setLevel(logging.DEBUG)logA.addHandler(logging.StreamHandler())logB = logging.getLogger('a.b')logB.addHandler(logging.StreamHandler())

输出结果:

Logger ALogger BLogger B

之所以 Logger B 被输出了 2 次,是因为 logB 是 logA 的子节点,并且 logB 中也定义了 Handler ,所以 logB 的 Handler 输出了一次, logA 的 Handler 也输出了一次,就 2 次了。如果想只输出一次,可以删掉 logB 中的 Handler 。当然,这也是有用处的,尤其是当你手头没有日志管理工具的时候。例如,主程序中需要输出所有的日志,以便了解程序整体的运行顺序,而某模块的日志,你想单独输出一份,以便清晰了解模块中的报错或者是执行顺序。

之前 peewee 的例子也就很容易解决了,只需要将 peewee 日志的 parent 属性设置为主程序的日志就可以了。

结语

其实这是一个比较容易说明的问题,完全没必要写这么多。我并不想跟大家分享 python 中的 logging 是怎么用的,而是想和大家分享 logging 如此实现的一种思想,因为我遇到过这个问题,也设计了解决方案,然后被完爆了。

进群“960410445” 获取更多案例教程哦~!

python logger_Python:logging 的巧妙设计!相关推荐

  1. Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life

    Python零基础速成班-第11讲-Python日志Logging,小游戏设计game of life 学习目标 Python日志Logging 小游戏设计game of life 课后作业(2必做) ...

  2. python logging logger_Python logging.Logger方法代码示例

    本文整理汇总了Python中logging.Logger方法的典型用法代码示例.如果您正苦于以下问题:Python logging.Logger方法的具体用法?Python logging.Logge ...

  3. python使用logging打印信息到日志文件中

    python使用logging打印信息到日志文件中 参考 Python输出日志信息 Python + logging 输出到屏幕,将log日志写入文件 使用logging打印日志到文件中的目的是: 解 ...

  4. Python中logging.config配置文件解读

    Python中logging.config配置文件解读 下面的函数用于配置logging模块,它们位于logging.config模块中.你可以使用这些函数来配置,也可以在logging或是loggi ...

  5. Python 是怎么火起来的? 转载 2018年01月12日 00:00:00 133 图:Python 之父 Guido 正在设计 Python 语言,结果家里突然潜入一条大蟒蛇,一番激烈斗争,大

    Python 是怎么火起来的? 转载 2018年01月12日 00:00:00 133 图:Python 之父 Guido 正在设计 Python 语言,结果家里突然潜入一条大蟒蛇,一番激烈斗争,大蟒 ...

  6. python 运行日志logging代替方案

    以下是自己写的 记录日志的代码.(和logging不搭嘎,如果如要学loggging模块,本文末尾有他人的链接.) # prtlog.py ############################## ...

  7. python使用logging捕获异常后继续执行函数

    使用python的logging模块可以在捕获异常后,记录异常且不退出程序: 例子: import logginglogging.basicConfig(filename='new.log', # 打 ...

  8. python网络爬虫的流程图_基于Python的网络爬虫的设计与实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的网络爬虫的设计与实现 作者:高祖彦 来源:<商情> 2020 年第 33 期 [摘要]一个爬虫从网上爬取数 ...

  9. django/python日志logging 的配置以及处理

    日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用处.在java 开发中通常用 log4j,logback 等三方组件.那么在 django中是怎么处 ...

最新文章

  1. 通关制单机器人_2020关务节|“数字供应链与智能通关”论坛——如何打造云上跨境贸易生态圈...
  2. 一个MySQL锁和面试官大战三十回合,我霸中霸!
  3. 关于资产发现-嗅探法
  4. python 获取当前时间 时间差
  5. html5 支持php标签吗,HTML5标签大全
  6. Python 中,字符串连接效率最高的方式是?一定出乎你的意料
  7. linux 内核 3.18,Linux Kernel 3.18 正式版发布下载
  8. Illustrator 教程,如何在 Illustrator 中设计插画?
  9. python的评分卡模型
  10. 2020年最新-Java基础面试题
  11. 数据结构之时间复杂度的计算
  12. 《缠论》的精髓是什么?
  13. 华为笔记本重装系统步骤
  14. Notification基本通知的两种写法
  15. Day 12 - 标签图片的方法与实作
  16. 《数据结构教程(第五版) 李春葆主编》判断题(第一章-第十章)
  17. 选购发烧游戏台式计算机的内存储器,游戏发烧友福音 惠普暗影精灵5 Super游戏台式电脑评测...
  18. 是什么引发了我对知识的渴望
  19. @keyup.enter.native不生效?看看@keyup.enter.native和@keyup.enter的区别和使用
  20. 常见的文本特征(句向量)提取方法有哪些?什么是One-Hot、TF-IDF?word2vec如何训练?【Python】

热门文章

  1. php任务奖励体系,phpwind7.5完备的积分体系
  2. 华为鸿蒙os正在国外小规模测试,华为鸿蒙OS正小规模测试
  3. ERP 系统数据库设计规范
  4. 【题解】生日蛋糕-C++
  5. [转载]linux下上传文件真的需要ftp么?
  6. springboot核心配置文件 application.properties 或者 yml 常用配置详解
  7. [中英对照]The sysfs Filesystem | sysfs文件系统
  8. 【同行说技术】Java程序员小白变大神必读资料汇总(三)
  9. 11G新特性 -- variable size extents
  10. 输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)