python的logging模块

logging模块提供了两种记录日志的方式:
一种是使用logging提供的模块级别的函数;
另一种是使用logging的四大组件(Logger、Handler、Filter、Formatter)。

使用logging模块级别函数记录日志

logging.debug(msg, *args, **kwargs)
logging.info(msg, *args, **kwargs)
logging.warning(msg, *args, **kwargs)
logging.error(msg, *args, **kwargs)
logging.critical(msg, *args, **kwargs)
logging.log(level, *args, **kwargs)
logging.basicConfig(**kwargs)
其中,logging.basicConfig(**kwargs)用于指定日志的级别、日志格式、日志输出的位置、日志文件的打开模式等。

import logging
logging.basicConfig(level=logging.DEBUG, 
                    format='%(levelname)s: %(threadname)s: %(asctime)s: %(message)s', 
                    datefmt='%Y-%m-%d %H:%M:%s', filename='example.log', filemode='w')  
# filemode='w'表示清空example.log中的日志重新写入
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(level=logging.INFO, 'info by log')

使用logging四大组件记录日志

logging的四大组件分别为:日志器Logger、处理器Handler、过滤器Filter和格式器Formatter,四者的关系为:
Logger需要通过Handler将日志信息输出到目标位置,如文件、sys.stdout、网络等;
Logger可以设置多个处理器将日志输出到不同的地方;
每个Handler都可以设置自己的过滤器实现日志过滤,从而只保留需要的日志;
每个Handler都可以设置自己的Formatter来设置不同的格式。

创建日志器

可以通过实例化Logger来创建一个日志器,也可以通过logging.getLogger()的方法来创建,一般推荐使用后者。logging.getLogger()方法有一个name参数,用于指定返回的日志器的名称,如果不指定的话默认为root。

myLogger = logging.getLogger('myLogger')
myLogger.setLevel(logging.DEBUG)  # 设置Logger的日志等级
添加处理器

Logger对象可以通过addHandler(handler)方法为自己添加一个或多个处理器。那么Handler怎么创建呢?一般不建议直接实例化Handler类来创建,以下给出一些常用的handler:

Handler 描述
logging.StreamHandler 将日志信息发送到stream, 如std.out、std.err或任何file-like对象
logging.FileHander 将日志信息发送到磁盘文件,默认条件下文件大小会无限增长
logging.handlers.RotatingFileHandler 将日志信息发送到磁盘文件,并将文件按大小切割
logging.handlers.TimeRotatingFileHander 将日志信息发送到磁盘文件,并将文件按时间切割
logging.handlers.HTTPHandler 将日志信息以GET或POST的方式发送到HTTP服务器
logging.handlers.SMTPHandler 将日志信息发送给指定的email地址
logging.NullHandler 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
fileHandler = logging.handlers.TimeRotatingHandler(filename='example.log', when='d', interval=1, encoding='utf-8')
fileHandler.setLevel(logging.INFO)  # 设置该handler的日志等级
myLogger.addHandler(fileHandler)
添加格式器

与Handler不同,Formatter可以通过直接实例化添加。Formatter的构造函数如下
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
该构造方法有三个可选参数:
· fmt:指定消息格式化字符串
· datefmt:指定时间的格式
· style:可取值为%、{、$,默认为%,此时fmt字符串的格式为%()s;如果取值{,则fmt字符串的格式为str.format();如果取值美元符号,则fmt字符串的格式为string.Template.substitute()

formatter = logging.Formatter('%(asctime)s %(thread)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%s')
fileHandler.setFormatter(formatter)
过滤器

Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。Filter是一个过滤器基类,它只允许某个logger层级下的日志事件通过过滤。(没用过,以后再看...)

日志流处理流程
image.png

你可能感兴趣的:(python的logging模块)