4.关于logging包日志观察者模式
不会扩展日志记录到什么地方,主要是不懂什么叫观察者模式
# 例如 日志想实现记录到 控制台、文件、钉钉群、redis、mongo、es、kafka、发邮件其中的几种的任意组合。
# low的人,会这么写,以下是伪代码,实现记录到控制台、文件、钉钉群这三种的任意几种组合。
def 记录到控制台(msg):
"""实现把msg记录到控制台"""
def 记录到文件(msg):
"""实现把msg记录到文件"""
def 记录到钉钉(msg):
"""实现把msg记录到钉钉"""
def 记录到控制台和文件(msg):
"""实现把msg记录到控制台和文件"""
def 记录到控制台和钉钉(msg):
"""实现把msg记录到控制台和钉钉"""
def 记录到文件和钉钉(msg):
"""实现把msg记录到文件和钉钉"""
def 记录到控制台和文件和钉钉(msg):
"""实现把msg记录到控制台和文件和钉钉"""
# 当需要把msg记录到文件时候,调用函数 记录到文件(msg)
# 当需要把msg记录到控制台时候,调用函数 记录到控制台(msg)
# 当需要把msg记录到钉钉时候,调用函数 记录到钉钉(msg)
# 当需要把msg记录到控制台和文件,调用函数 记录到控制台和文件(msg)
# 当需要把msg记录到控制台和钉钉,调用函数 记录到控制台和钉钉(msg)
# 当需要把msg记录到控制台和文件和钉钉,调用函数 记录到控制台和文件和钉钉(msg)
"""
这样会造成,仅记录到控制台 文件 钉钉这三种的任意几个,需要写6个函数,调用时候需要调用不同的函数名。
但是现在日志可以记录到8种地方,如果还这么low的写法,需要写8的阶乘个函数,调用时候根据场景需要会调用8的阶乘个函数名。
8的阶乘结果是 40320 ,如果很low不学设计模式做到灵活组合,需要多写 4万多个函数,不学设计模式会多么吓人。
"""
观察者模式图片
菜鸟教程的观察者模式demo连接 观察者模式demo
这个uml图上分为Subject 和 基类Observer,以及各种继承或者实现Observer的XxObserver类, 其中每个不同的Observer需要实现doOperation方法。
如果对应到python内置的logging日志包的实现,那么关系就是:
Logger是uml图的Subject
loging.Handler类是uml图的Observer类
StreamHandler FileHandler DingTalkHandler 是uml图的各种XxObservers类。
StreamHandler FileHandler DingTalkHandler类的 emit方法是uml图的doOperation方法
只有先学设计模式,才能知道经典固定套路达到快速看代码,能够达到秒懂源码是怎么规划设计实现的。
如果不先学习经典设计模式,每次看包的源码,需要多浪费很多时间看他怎么设计实现的,不懂设计模式,会觉得太难了看着就放弃了。
在python日志的理解和使用上,国内能和我打成平手的没有几人。