目录
1 简单介绍:
2 使用方法介绍:
1.日志级别
2.部分名词解释
3.创建控制台 及 文件 日志输出
4. 记录异常 traceback
5.日志滚动和过期删除 按时间
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
import logging # 引入logging模块
logging.debug("1")
logging.info("2")
logging.warning("3")
logging.error("4")
logging.critical("5")
输出:
WARNING:root:3
ERROR:root:4
CRITICAL:root:5
上面可以看到只有后面三个能打印出来
默认生成的root logger的level是logging.WARNING,低于该级别的就不输出了
级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG
debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
这时候,如果需要显示低于WARNING级别的内容,可以引入NOTSET级别来显示,或者设置较低的权限即可:
#logging.basicConfig(level=logging.NOTSET) #二者选其一
logging.basicConfig(level=logging.DEBUG)
输出:
DEBUG:root:1
INFO:root:2
WARNING:root:3
ERROR:root:4
CRITICAL:root:5
Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。
Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
logger.debug("1")
logger.info("2")
logger.warning("3")
logger.error("4")
logger.critical("5")
控制台输出为:
日志文件输出记录:
2018-08-22 11:17:23,943 - mylogger - DEBUG - 1
2018-08-22 11:17:23,943 - mylogger - INFO - 2
2018-08-22 11:17:23,943 - mylogger - WARNING - 3
2018-08-22 11:17:23,943 - mylogger - ERROR - 4
2018-08-22 11:17:23,944 - mylogger - CRITICAL - 5
format 常用格式说明:
%(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: 打印日志信息
与上面代码差不多
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
try:
open('luanluan.txt')
except(SystemExit, KeyboardInterrupt):
raise
except FileNotFoundError as e:
logger.error('Failed to open file', exc_info=True)
输出为:
当: exc_info=False时,输出:
import logging
import time
from logging.handlers import TimedRotatingFileHandler
def backroll():
#日志打印格式
log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'
formatter = logging.Formatter(log_fmt)
#创建TimedRotatingFileHandler对象
log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="S", interval=5, backupCount=5) #注意日志名称、时间的设置
log_file_handler.suffix = "%Y-%m-%d_%H-%M-%S.log"
log_file_handler.setFormatter(formatter)
logging.basicConfig(level=logging.INFO)
log = logging.getLogger()
log.addHandler(log_file_handler)
#循环打印日志
log_content = "test log"
count = 0
while count < 30:
log.error(log_content+str(count))
time.sleep(1)
count = count + 1
log.removeHandler(log_file_handler)
输出的文件名称:
filename:日志文件名的prefix;
when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件
backupCount: 表示日志文件的保留个数
参考:
1.python中logging模块的一些简单用法
https://www.cnblogs.com/CJOKER/p/8295272.html
2.Python中的logger和handler到底是个什么鬼
https://www.cnblogs.com/anpengapple/p/5048123.html