一、logging的基础运用
1. logging库日志级别
级别 | 级别数值 | 使用时机 |
DEBUG | 10 | 详细信息,常用于调试 |
INFO | 20 | 程序正常运行过程中产生的一些信息 |
WARNING | 30 | 警告,虽然程序还在正常工作,但有可能发生错误 |
ERROR | 40 | 由于更严重的问题,程序已经不能执行一些功能了 |
CRITICAL | 50 | 严重错误,程序已不能继续运行 |
默认的日志级别是warning
导入logging模块
import logging
2. logging日志console中输出
# 默认的日志输出级别为warning,则warning,error,critical级别日志默认输出
# 若需要输出debug+info级别日志,可以调用basicConfig()方法,指定级别输出,如下:
logging.basicConfig(level=logging.DEBUG)
logging.debug('This debug log')
logging.info('This info log')
logging.warning('This warning log')
logging.error('This error log')
logging.critical('This critical log')
3. logging日志保存到指定文件中
# 若日志需要指定输出到某个文件中,则在logging.basicConfig()方法中加上filename参数即可,如下
logging.basicConfig(filename='demo.log', filemode='w', level=logging.DEBUG)
#日志默认为追加模式,所以这里需要指定filemode='w',改成清空写入模式
4. 向日志输出变量
logging.basicConfig(level=logging.DEBUG)
#格式化输出
name='Txy'
old=22
logging.debug('my name is {}, I am {} years old'.format(name,old))
logging.debug(f'my name is {name}, I am {old} years old')
5. 设置日志输出格式和添加一些公共信息
asctime: 输出日志日期和时间---传入datefmt参数可以指定输出格式
levelname:输出日志级别
filename:输出生成日志的文件名
lineno:输出日志所针对的代码行号
message:输出具体的日志信息
logging.basicConfig(format="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s",datefmt="%Y-%m-%d %H:%M:%S",level=logging.DEBUG)
二、logging的高级应用
logging模块采用了模块化设计,主要包含四种组件:
Loggers:记录器,提供应用程序代码能直接使用的接口;
Handlers:处理器,将记录器产生的日志发送至目的地;
Filters:过滤器,提供更好的粒度控制,决定哪些日志会被输出;
Formatters:格式化器,设置日志内容的组成结构和消息字段。
1. logger记录器
(1)提供应用程序的调用接口
logger = logging.getLogger(__name__)
logger是单例的
(2)决定日志打印的级别
logger.setLevel()
(3)将日志内容传递到相关联的handlers中
logger.addHandler() #记录器关联xx处理器
logger.removeHandler() #记录器移除关联xx处理器
2. Handlers处理器
它们将日志分发到不同的目的地。可以是文件、标准输出、邮件或者通过socket、http等协议发送到任何地方。
StreamHandler 标准输出stdout分发器--控制台对象。
创建方法:
sh = logging.StreamHandler()
FileHandler 将日志保存到磁盘文件的处理器
创建方法:
fh = logging.FileHandler(filename,mode='a',encoding=None,delay=False)
setFormatter():设置当前handler对象使用的消息格式
常用的Handlers处理器
- StreamHandler
- FileHandler
- BaseRotatingHandler
- RotatingFileHandler # 根据文件大小切分日志
- TimedRotatingFileHandler # 基于时间的文件日志处理类,可以根据时间点和时间间隔来切分日志,如每天的0点,每两个小时。有其固定定义的几种类型
3. Formatters格式
Formatter对象用来最终设置日志信息的顺序、结构和内容。
其构造方法为
ft = logging.Formatter.__init__(fmt="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s",datefmt=None,style='%')
# datefmt默认是%Y-%m-%d %H:%M:%S样式的
# style参数默认为百分符%,这表示%(<dictionary key>)s格式的字符串
三、logging日志方法封装
import logging.handlers
import logging
def log_config(filename , when='midnight' , interval=1 , backup_count=7):
"""
功能:初始化日志配置函数
:param filename: 日志文件名
:param when: 设定日志切分的间隔时间单位
:param interval: 间隔时间单位的个数,指等待多少个 when 后继续进行日志记录
:param backup_count: 保留日志文件的个数
:return:
"""
# 1. 创建日志器对象
logger = logging.getLogger()
# 2. 设置日志打印级别
logger.setLevel(logging.INFO)
# logging.DEBUG 调试级别
# logging.INFO 信息级别
# logging.WARNING 警告级别
# logging.ERROR 错误级别
# logging.CRITICAL 严重错误级别
# 3. 创建处理器对象
# 控制台对象
sh = logging.StreamHandler()
# 日志文件对象
fh = logging.handlers.TimedRotatingFileHandler(filename ,
when=when ,
interval=interval ,
backupCount=backup_count ,
encoding='utf-8')
# 4. 日志信息格式
fmt = "%(asctime)s|%(levelname)s|%(filename)s:%(lineno)d|%(message)s"
formatter = logging.Formatter(fmt)
# 5. 给处理器设置日志信息格式
sh.setFormatter(formatter)
fh.setFormatter(formatter)
# 6. 给日志器添加处理器
logger.addHandler(sh)
logger.addHandler(fh)
if __name__ == '__main__':
# 初始化日志
log_config('a.log')
# 打印输出日志信息
logging.debug('我是一个调试级别的日志')