提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
利用python
的logging
模块可以很简单的记录程序运行中的各种日志,尽管自己写一个函数,将程序运行日志写到文件并不是很难,但已经有了logging
模块,这大可不必自己动手。
一、logging模块介绍
1.1 日志级别
日志一共分为5个
等级,各个等级记录的信息有所差异:
级别 | 说明 |
---|---|
DEBUG | 输出详细的运行情况,主要用于调试 |
INFO | 确认一切按预期运行,一般用于输出重要运行情况 |
WARNING | 一些意想不到的事情发生了(比如:“警告:内存空间不足”),但是这个软件还能按期工作,在不久的将来会出现问题 |
ERROR | 发生了错误,软件没能执行一些功能,还可以继续执行 |
CRITICAL | 一个严重的错误,表明程序本身可能无法继续运行 |
修改级别 | logging.root.setLevel('INFO') |
这5个等级,也分别对应5种打日志的方法:debug、info、warning、error、critical
默认是WARNING
,当错误级别在WARNING
或之上时才能被跟踪.
1.2 日志收集器
1.2.1 创建日志收集器输出到控制台:
import logging
# 1、日志收集器的创建:logging.getLogger(名称)
http_log = logging.getLogger('TESTLEAF')
# 2、设置日志收集的等级为DEBUG:规定日志收集等级
http_log.setLevel('DEBUG')
# 3、创建一个日志输出渠道(控制台), 规定控制台输出等级
sh = logging.StreamHandler()
sh.setLevel('DEBUG')
# 4、将输出渠道(控制台)添加到日志收集器中
http_log.addHandler(sh)
http_log.debug('---------DEBUG------------')
http_log.info('----------info-------------')
1.2.2 创建日志收集器输出到文件:
import logging
# 1、日志收集器的创建:logging.getLogger(名称)
http_log = logging.getLogger('TESTLEAF')
# 2、设置日志收集的等级为DEBUG:规定日志收集等级
http_log.setLevel('DEBUG')
# 3、创建一个日志输出渠道(文件)
fh = logging.FileHandler(r'logs\testleaf.log', encoding='utf-8')
fh.setLevel('ERROR') # 规定日志文件输出等级
# 6、将日志输出渠道添加到日志收集器
http_log.addHandler(fh)
http_log.info('----------info-------------')
http_log.warning('-------warning----------')
http_log.error('----------error-----------')
二、格式化输出
2.1 输出格式
可以通过logging.Formatter指定日志的输出格式,这个参数可以输出很多有用的信息,如下:
%(name)s:收集器名称
%(levelno)s:打印日志级别的数值
%(levelname)s:打印日志级别名称
%(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s:打印当前执行程序名
%(funcName)s:打印日志的当前函数
%(lineno)d:打印日志的当前行号
%(asctime)s:打印日志的时间
%(thread)d:打印线程ID
%(threadName)s:打印线程名称
%(process)d:打印进程ID
%(message)s:打印日志信息
在工作中给的常用格式如下:
formats = '%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s'
import logging
#1、日志收集器的创建:logging.getLogger(名称)
http_log = logging.getLogger('TESTLEAF')
#2、设置日志收集的等级为DEBUG:规定收集等级
http_log.setLevel('DEBUG')
#3、设置输出格式
mats='%(asctime)s - [%(filename)s-->line:%(lineno)d] - %(levelname)s: %(message)s'
mat= logging.Formatter(mats)
#4、创建一个日志输出渠道(文件)
fh = logging.FileHandler(r'logs\testleaf.log', encoding='utf-8')
fh.setLevel('ERROR') # 规定输出等级
fh.setFormatter(mat) # 为日志输出渠道设置日志输出的格式
#5、将日志输出渠道添加到日志收集器
http_log.addHandler(fh)
http_log.info('----------info-------------')
http_log.warning('-------warning----------')
http_log.error('----------error-----------')
2.2 日志轮转
随着程序运行时间增加,日志的记录越来越大,创建新的日志文件并删除最老的日志文件有了需求。
2.2.1 按日志大小轮转
import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
#4、创建一个日志输出渠道(输出到文件的轮转器)
fh = RotatingFileHandler(filepath, maxBytes=500, backupCount=10, encoding='utf-8')
fh.setLevel(f_level)
fh.setFormatter(mat)
#5、将日志输出渠道添加到日志收集器
http_log.addHandler(fh)
#参数:
maxBytes: 设置文件的大小(单位:字节)
backupCount:轮转的文件数量,超过这个数量就删掉最早的
2.2. 2 按时间轮转
# 创建一个按时间轮转的文件输出渠道
fh = TimedRotatingFileHandler(filename = 'testleaf.log',
encoding = 'utf-8',
when = 'D',
interval = 7,
backupCount = 10)
# 参数详解:
interval:设置时间间隔
when:设置间隔单位(默认H)
S - Seconds(秒)
M - Minutes(分钟)
H - Hours(小时)
D - Days(天)
backupCount:轮转的文件数量