- 参考文章一:什么是分布式锁?实现分布式锁的三种方式
- 参考文章二:多进程下python下的logging模块
谈一谈对python的第三方库 logging 的使用心得
本心得多来自于 logging 库的源码
logger = logging.getLoger()
: 由此方式得到的是logging中的root,是单例模式logger = logging.getLogger("module_name")
:该方式得到的logger也是单例模式,但不是root,如果他的一些属性比如handler,level等没有设置的话,就会继承于root- logger 的 handeler 可以进行删除和替换
- file_handele 还可以指定输出的文件名称
基于以上几点,logger就可以非常灵活了,可以有以下用途:
- 分布式机器运行的时候可以通过修改 root 的 file_handler 句柄来控制输出文件的名字,可以避免多机写入一个文件,而需要分布式锁的问题【问题一】
- 同时可以根据任务的细分直接将logger输出文件的名字设置为任务名成,可以避免单机多个任务写在一个文件中【问题二】
- 以后的前提是root在主节点进行修改,其他节点直接使用 ’logger = logging.getLogger(“module_name”)‘, 这样在单个串行任务中,副节点的 logger 的属性都会随主节点的变化,实现了副节点的logger的属性的自适应调整。
最近在使用的过程中右多了一些见识【20240606】
logging 模块必须要加一个handler,比如说logging 模块中自带的FileHandler
,StreamHandler
等,这些句柄是logging 模块自带的,所以也是常规操作。但是我们如果有特殊的需求,比如:
- 发生
Error
或者Warning
的时候邮件通知 - 想基于
ZMQ
把消息发送出去(实现分布式日志可以这么做)
在这些情况下我们可以基于继承logging.Handle
模块来重写符合自己需求的一些handler, 当然这些需求应该是在 logger.debug
, logger.info
, logger.warning
, logger.error
,logger.exception
打印一些东西的同时起作用。手写自己的 handler 一般要有以下几个步骤:
- 继承
logging.Handle
函数 - 重写
__init__
函数 - 重写
emit
函数