python logging 要点

print大法固然随手就能方便写出来,但是某些情况还是用的不爽,需要更为专业的日志记录,那就看下python内置的logging模块吧。另外还有google出品的glog等第三方的日志模块,本问不涉及了。

一些基本概念

logger 记录器,记录器可以指定一个或多个handler处理器,以便同时记录到多个位置或者别的什么的区别记录。
handler 实际的处理器,logging模块里的日志最终处理者。
filter 过滤器,logger和handler上都可以指定filter。
formatter 格式化器,这个概念简单,就是决定最终输出格式的,关联与handler上。
loggers树 所有的loggers被整合成一棵以root为根的树,以定义时的名字为信息构建这个树,定义时以.符号分级。另外,某logger生成的record记录完后会自动向其父级logger传播,一直传播到root节点或遇到某级配置propagate = False的logger。
root根logger 默认会被创建的记录器。直接使用logging.warn()模块级日志函数使用的记录器就是它, basicConfig() 的设置也是针对它的, logging.getLogger() 不制定名字获得的logger也是它。

一些使用建议

配置方法

logging以子模块logging.config支持下面三种配置方式:

fileConfig 文件形式配置,文件格式就是configparser所支持的格式,基本就是ini格式。
dictConfig 直接用一个dict字典描述的配置信息,除了方便代码中直接写dict配置外,也方便导入以其他诸如json、yaml等配置文件描述的配置。
listen 启动一个socket server监听配置信息。
*basicConfig 这个basicConfig并不属于logging.config,但它可以配置最顶级的root节点。
*代码配置 对啊,我们当让可以直接在代码中创建logging中的各种对象添加到loggers树中,也可以用代码再对树中的各项予以再配置。

一些使用tips

getLogger(__name__)

使用模块方法logging.getLogger方法来获取或创建logger,多次以同一名称调用该方法获得的logger是同一个对象,不用担心重复或重新创建,安心使用。一般直接用模块名称__name__创建模块内使用的logger。

msg延迟格式化

尽量使用logging.info("info: %s",param)的方式而不是已格式化的字符串logging.info("info: {}".format(param)),因为msg可能被配置过滤掉无需输出了啊。

已内置的Handlers

FileHandler 基本的文件日志处理器。
WatchedFileHandler 它会监视文件,如果日志文件被其他程序改变,会自动关闭并重新打开文件。
RotatingFileHandler,
TimedRotatingFileHandler
以一组序列的文件名来循环记录日志,以文件大小或者时间间隔为限。
SocketHandler,
DatagramHandler
分别用TCP和UDP方式发布日志。
SMTPHandler,HTTPHandler 以SMTP和HTTP方法发布日志。
MemoryHandler 先缓存日志在内容中,后再flush到目标handler上。
NullHandler no-op。
SysLogHandler,
NTEventLogHandler
发布日志到unix syslog和NT event上。
StreamHandler 支持stdout stderr,以及其他支持write()flush()方法的所有文件或类文件对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注