日志操作
Python中有一个标准库模块logging可以直接记录日志--------logging模块
基本用法
import logging
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
设置日志级别
logging中默认的日志级别为WARNING,程序中大于等于该级别的日志才能输出,小于该级别的
日志不会被打印出来。
logging.basicConfig(level=logging.DEBUG)
如何选择日志级别
在开发环境和测试环境中,为了尽可能详细的查看程序的运行状态来保证上线后的稳定性,可
以使用DEBUG或INFO级别的日志获取详细的日志信息,这是非常耗费机器性能的。
在生产环境中,通常只记录程序的异常信息、错误信息等(设置成WARNING或ERROR级
别),这样既可以减小服务器的I/O压力,也可以提高获取错误日志信息的效率和方便问题的
排查。
设置日志格式
logging.basicConfig(format="%(levelname)s:%(name)s:%(message)s")
自定义日志格式:
代码:
importlogging
fmt='%(asctime)s%(levelname)s[%(name)s][%(filename)s(%(funcName)s:%(lineno)d)]-%
(message)s'
logging.basicConfig(level=logging.INFO,format=fmt)
logging.debug("调试")
logging.info("信息")
logging.warning("警告")
logging.error("错误")
将日志信息输出到文件中:
默认情况下Python的logging模块将日志打印到了标准输出中(控制台)
logging.basicConfig(filename="a.log")
代码:
importlogging
fmt='%(asctime)s%(levelname)s[%(name)s][%(filename)s(%(funcName)s:%(lineno)d)]-%
(message)s'
logging.basicConfig(filename="a.log",level=logging.INFO,format=fmt)
logging.debug("调试")
logging.info("信息")
logging.warning("警告")
logging.error("错误")
logging日志模块四大组件
日志器 logger : 是程序的入口,主要用来记录日志的信息
处理器 handler : 决定了日志的输出目的地
格式器 formatter :决定了日志的输出格式
过滤器 filter: 决定哪些日志信息被输出,哪些被丢弃
logging模块就是通过这些组件来完成日志处理的
简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。
日志器:
Logger对象的任务:
向程序暴露记录日志的方法
基于日志级别或Filter对象来决定要对哪些日志进行后续处理
将日志消息传送给所有感兴趣的日志handlers
创建日志对象
logger = logging.getLogger()
logger = logging.getLogger("myLogger")
logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则返回root日志器对象。 若以相同的name参数值多次调用getLogger()方法,将会
返回指向同一个logger对象的引用。
处理器
Handler类
Handler对象的作用是将消息分发到handler指定的位置,比如:控制台、文件、网络、邮件等。Logger对象可以通过addHandler()方法为自己添加多个handler对象。
如何创建Handler对象
在程序中不应该直接实例化和使用Handler实例,因为Handler是一个基类,它只定义了Handler应该有的接口。 应该使用Handler实现类来创建对象,logging中内置的常用的Handler包括:
Handler常用的方法:
创建日志器
logger = logging.getLogger()
设置日志器的级别
logger.setLevel(logging.INFO)
将格式器添加到处理器中
handler.setFormatter(formatter)
格式器
Formatter类
Formatter对象用于配置日志信息的格式
创建ormatter对象:
formatter = logging.Formatter(fmt=None, datefmt=None, style='%')
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
整体实现步骤:
实现步骤分析
1.创建日志器对象
2.创建控制台处理器对象
3.创建文件处理器对象
4.创建格式化器对象
5.把格式化器添加到处理器中
6.把处理器添加到日志器中
定义日志格式
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
formatter = logging.Formatter(fmt)
把日志输出到控制台
logger = logging.getLogger()
sh = logging.StreamHandler()
sh.setFormatter(formatter)
logger.addHandler(sh)
把日志输出到文件中
fh = logging.FileHandler("./b.log")
fh.setFormatter(formatter)
logger.addHandler(fh)
fh = logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0) 将日志信息记录到文件中,以特定的时间间隔切换日志文件。
filename: 日志文件名
when: 时间单位,可选参数
S - Seconds
M - Minutes
H - Hours
D - Days
midnight - roll over at midnight
W{0-6} - roll over on a certain day; 0 - Monday
interval: 时间间隔
backupCount: 日志文件备份数量。如果backupCount大于0,那么当生成新的日志文件时,将只保留backupCount个文件,删除最老的文件。
范例代码:
import logging
# 先创建日志器
logger = logging.getLogger()
# 再设置日志器的级别
logger.setLevel(logging.INFO)
# 再创建处理器
handler = logging.StreamHandler()
# 再设置处理器的级别
handler.setLevel(logging.INFO)
# 创建格式器
# 确立文件输出格式
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
formatter = logging.Formatter(fmt=fmt)
# 将格式器添加到处理器中
handler.setFormatter(formatter)
# 将处理器添加到日志器
logger.addHandler(handler)
# 输出日志信息
logger.info("这是一个普通的信息")

浙公网安备 33010602011771号