第一:为什么使用logging模块
- 灵活性好,方便配置
- 输出或保存不同级别日志
第二:logging模块结构
logging 在源码中有三个文件,结构如下:
├── config.py
├── handlers.py
└── __init__.py
_int.py中实现了基础功能,主要的逻辑就在这个文件中handlers.py 是一些Handlers用起来很方便的.
config.py 是对配置做处理的方法.
第三:主要的逻辑
1.调用关系【这张图简单明了,盗用了】
2.逻辑
- A: 获取logger日志记录器实例
logger = logging.Getlogger(__name__)
- B: 设置日志记录器层级和内容
也可以添加过滤器
logger.info('info')
- C: 处理器handlers设置,并添加到logger实例(可以同时添加多个处理器)
处理器设置属性:处理日志层级,日志格式器,过滤器,对应处理器选择
formater = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') file_handler = logging.handlers.RotatingFileHandler(filename='logs/jessproxy.log') file_handler.setLevel(logging.INFO) file_handler.setFormatter(formater) consle_handle = logging.StreamHandler() consle_handle.setLevel(logging.INFO) consle_handle.setFormatter(formater) logger.addHandler(file_handler) logger.addHandler(consle_handle)
- D: 过滤器Filter
多种过滤器能同时应用在记录器和处理器中
- E: 格式器Formatter
格式器负责将丰富的元数据日志记录转换为字符串,一般应用在处理器中
3.日志工作流程图
第四:各模块介绍
- 日志层级
logging模块将日志分为了五个等级:
五个等级的日志信息分别使用:logging模块的debug()、info()、warning()、error()、critical()方法来实现。
- DEBUG:调试信息,通常在诊断问题的时候用得着;
- INFO:普通信息,确认程序安装预期运行;
- WARNING:警告信息,表示发生了意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行;
- ERROR:错误信息,程序运行中出现了一些问题,一些功能没有执行;
- CRITICAL:危险信息,一个严重的错误,导致程序无法继续运行。
默认情况下,logging使用的日志级别是warning,这表示只有在这个级别及其以上级别的日志信息才会被记录,所以默认情况下debug信息和info信息都不会被显示出来。
- 记录器Logger
日志记录器(Logger)是日志处理的核心组件,包含了需要记录日志的地方、变化的字符串、参数、请求的信息队列等信息。
- Logger.setLevel(lel):指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
- Logger.addFilter(filt)、Logger.removeFilter(filt):添加或删除指定的filter
- Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):增加或删除指定的handler
- Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():可以设置的日志级别
- 设置logger的level
- 处理器Handler
处理器Handlers 将logger发过来的信息进行准确地分配至其他终端。
在logging模块中,有很多种日志处理器用于不同的用途,下面介绍几个常用的:
- StreamHandler:用于将日志消息发送到控制台;
- FileHandler:用于将日志消息写入文件中;
- SMTPHandler:用于将日志消息发送到指定的电子邮箱;
- HTTPHandler:使用GET或POST方法将日志消息发送给某个HTTP服务器;
其中我们最常使用的,还是FileHandler处理器,将日志消息写入文件中。
此外,处理器的设置
- Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
- Handler.setFormatter():给这个handler选择一个格式
- Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
- 过滤器Filter
默认的Filter类,需要获取一个字符串类型的参数,该参数是用来判断日志信息是否允许被记录。Filter类中有一个filter方法,该方法返回真则表示日志信息被记录,否则将丢弃,不再处理。如果该参数为空字符串,则filter方法返回真;否则,该字符串参数表示着一个Logger(每个Logger对象都有一个用点分隔的字符串名字),只有当前处理日志信息的Logger对象是该字符串参数指定的Logger对象或子对象,filter方法才返回真,其它情况返回假。
LOG=logging.getLogger(”chat.gui.statistic”) console = logging.StreamHandler() console.setLevel(logging.INFO) formatter = logging.Formatter(’%(asctime)s %(levelname)s %(message)s’) console.setFormatter(formatter) filter=logging.Filter(”chat.gui”) console.addFilter(filter) LOG.addHandler(console)
Handler上添加了一个过滤器。现在我们输出日志信息的时候就会经过过滤器的处理。名为“A.B”的过滤器只让名字带有 “A.B”前缀的Logger输出信息。可以添加多个过滤器,只要有一个过滤器拒绝,日志信息就不会被输出。另外,在Logger中也可以添加过滤器。
- 格式器Famatter
设置日志信息最后的规则、结构和内容。Formatters 指定了最终某条记录打印的格式布局。Formatter会将传递来的信息拼接成一条具体的字符串,默认情况下Format只会将信息
%(message)s
直接打印出来。Format中有一些自带的LogRecord属性可以使用。
Attribute Format Description asctime %(asctime)s 将日志的时间构造成可读的形式,默认情况下是‘2016-02-08 12:00:00,123’精确到毫秒 filename %(filename)s 包含path的文件名 funcName %(funcName)s 由哪个function发出的log levelname %(levelname)s 日志的最终等级(被filter修改后的) message %(message)s 日志信息 lineno %(lineno)d 当前日志的行号 pathname %(pathname)s 完整路径 process %(process)s 当前进程 thread %(thread)s 当前线程
主要参考链接:
- http://www.52ij.com/jishu/666.html
- https://blog.csdn.net/iodjsvf8u1j7kyc/article/details/79244832
- https://blog.csdn.net/liyh_xd/article/details/78713407
- http://python.jobbole.com/87300/