1、日志概念
日志就是用于记录系统运行时的信息,对一个事件的记录,也称为Log。
2、日志作用
- 调试程序
- 了解系统程序运行的情况,是否正常
- 系统程序运行故障分析与问题定位
- 用来做用户行为分析和数据统计
3、 日志级别
日志级别:是指日志信息的优先级、重要性或者严重程度
常见的日志级别 | 描述 |
DEBUG | 调试级别,打印非常详细的日志信息,通常用于对代码的调试 |
INFO |
信息级别,打印一般的日志信息,突出强调程序的运行过程 |
WARNING | 警告级别,打印警告日志信息,表明会出现潜在错误的情形,一般不影响软件的正常使用 |
ERROR | 错误级别,打印错误异常信息,该级别的错误可能会导致系统的一些功能无法正常使用 |
CRITICAL | 严重错误级别,一个严重的错误,这表明系统可能无法继续运行 |
说明:
上面列表中的日志级别是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL;
当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息;
一般建议只使用DEBUG、INFO、WARNING、ERROR这四个级别。
4、日志的基本用法
import logging # 导入日志依赖包
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
(1)设置日志级别
logging.basicConfig(level=logging.DEBUG)
level可选:
logging.DEBUG
logging.INFO
logging.WARNING
logging.ERROR
logging.CRITICAL
注:logging中默认的日志级别为WARNING,程序中大于等于该级别的日志才能输出,小于该级别的日志不会被打印出来。
(2)设置日志格式
默认的日志的格式为:日志级别:Logger名称:日志内容
自定义日志格式:
logging.basicConfig(format="格式化信息")
常用的格式化信息
format = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
format参数可能用到的格式化信息:
占位符 | 描述 |
%(name)s |
Logger的名字 |
%(levelno)s | 数字形式的日志级别 |
%(levelname)s | 文本形式的日志级别 |
%(pathname)s | 调用日志输出函数的模块的完整路径名,可能没有 |
%(filename)s | 调用日志输出函数的模块的文件名 |
%(module)s | 调用日志输出函数的模块名 |
%(funcName)s | 调用日志输出函数的函数名 |
%(lineno)d | 调用日志输出函数的语句所在的代码行 |
%(created)f | 当前时间,用UNIX标准的表示时间的浮点数表示 |
%(relativeCreated)d | 输出日志信息时的,自Logger创建以来的毫秒数 |
%(asctime)s | 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896” |
%(thread)d | 线程ID。可能没有 |
%(threadName)s | 线程名。可能没有 |
%(process)d | 进程ID。可能没有 |
%(message)s | 用户输出的消息 |
(3)将日志信息输出到文件中
默认情况下Python的logging模块将日志打印到了标准输出中(控制台)。
将日志信息输出到文件中:
logging.basicConfig(filename="输出的文件名.log")
日志的高级用法
1、logging日志模块四大组件
组件名称 | 类名 | 功能描述 |
日志器 | Logger | 提供了程序使用日志的入口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
2、组件之间的关系
日志器:提供了记录日志的入口,如:log.info(“”)
处理器:真正将日志器内容发送到控制台还是文件或网络,都是处理器干的;每个日志器都可 以添加多个不同的处理器
格式器:处理器可以设置不同的格式,就需要使用格式器
过滤器:处理器需要过滤日志信息,就需要设置过滤器
3、Logger类
Logger类对象的任务:
- 向程序暴露记录日志的方法
- 基于日志级别或Filter对象来决定要对哪些日志进行后续处理
- 将日志消息传送给所有感兴趣的日志handlers
如何创建Logger类对象:
logger = logging.getLogger()
或者
logger = logging.getLogger(name)
logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则返回root日志器对象。 若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引用
Logger常用的方法:
方法 | 描述 |
logger.debug() logger.info() logger.warning() logger.error() logger.critical() |
打印日志 |
logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别 |
logger.addHandler() | 为该logger对象添加一个handler对象 |
logger.addFilter() | 为该logger对象添加一个filter对象 |
4、Handler类
作用:Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。 Logger对象可以通过addHandler()方法为自己添加多个handler对象。
如何创建Handler类对象:
Handler | 描述 |
logging.StreamHandler | 将日志消息发送到输出到Stream,如std.out, std.err或任何 file-like对象 |
logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增 长 |
logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 |
logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割 |
logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 |
logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址 |
Handler常用的方法:
方法 | 描述 |
handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别 |
handler.setFormatter() | 为handler设置一个格式器对象 |
handler.addFilter() | 为handler添加一个过滤器对象 |
5、Formatter类
作用:Formatter对象用于配置日志信息的格式。
如何创建Formatter类对象:
formatter = logging.Formatter(fmt=None, datefmt=None, style='%')
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
6、日志高级用法综合案例分析
目标:将日志信息同时输出到控制台和文件中
import logging.handlers # 导入此包才能使用handler类创建对象
# 获取logger
logger = logging.getLogger()
# 设置级别
logger.setLevel(logging.INFO)
# 获取控制台 处理器
sh = logging.StreamHandler()
# 根据时间切割文件 处理器
th = logging.handlers.TimedRotatingFileHandler(filename="文件名.log",
when="S",
interval=1,
backupCount=3,
encoding="utf-8")
# 添加格式器
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
fm = logging.Formatter(fmt)
# 将格式器 添加到处理器中
sh.setFormatter(fm)
th.setFormatter(fm)
# 将 控制台处理器添加到 logger
logger.addHandler(sh)
logger.addHandler(th)
# 打印信息
logger.info("info")
logger.debug("debug")
logger.error("error")
logger.warning("warning")
logging.handlers.TimedRotatingFileHandler()参数说明:
filename:文件名
when:间间隔的类型可选S(秒)、M(分钟)、H(小时)、D(天)、midnight(一夜)、W{0-6}(周几)
interval: 时间间隔
backupCount:能留几个日志文件,超过数量就会丢弃掉老的日志文件