Python

python-应用logging打印日志

2021-12-10  本文已影响0人  Rainbow想喝奶茶

今日份的更新,是如何实现打印日志的功能。仍然是靠临摹实现最基本的功能,开发可真难啊~

在程序运行过程中,打印日志可以帮助了解程序运行情况及问题定位,python提供了一个标准库模块logging,可以实现一个灵活的事件日志系统。

它一共有两种方式记录日志,这里应用的是使用logging日志系统的四大组件。还有一种是使用logging提供的模块级别的函数,本篇未做介绍。logging模块无需下载,文件中可以直接引入。

import logging

logging日志级别

logging模块提供5个日志等级,级别依次递增,DEBUG<INFO<WARNING<ERROR<CRITICAL。但信息量依次递减,前两个通常是在开发期间应用,输出的信息比较详细,后三个则是在生产环境应用较多。

应用程序设置日志级别或是logging模块设置日志级别之后,日志会输出大于等于此等级的日志。

logging模块定义等级函数的用法如下:

logging.debug(msg,*args,**kwargs)# 定义一个严重级别为debug的函数
logging.info(msg,*args,**kwargs)# 定义一个严重级别为info的函数
logging.warning(msg,*args,**kwargs)# 定义一个严重级别为warning的函数
logging.error(msg,*args,**kwargs)# 定义一个严重级别为error的函数
logging.critical(msg,*args,**kwargs)# 定义一个严重级别为critical的函数

logging日志格式

logging模块中,日志输出的内容及格式均可以进行自定义,下面列举部分输出信息。

内容 格式
日志输出时间 %(asctime)s
日志级别 %(levelname)s
日志器名称 %(name)s
文件名称带后缀 %(filename)s
调用日志记录代码所在行号 %(lineno)s
日志记录的文本内容 %(message)s

logging四大组件

组件名称 类名 作用
日志器 Logger 直接应用的日志接口
处理器 Handler 将Logger创建的日志发送到目标位置
格式器 Formatter 日志输出格式
过滤器 Filter 设置输出日志的过滤条件

这几个组件可以理解为,一个日志器可以有多个处理器,不同的处理器可以有不同的格式器以及不同的过滤器,并且把日志输出到不同的位置。

logging组件类

接下来,就可以应用logging四个组件对应的类进行日志的输出了。

logger类

想要创建一个日志器对象,语法为

logger=logging.getLogger()

括号内name为可选参数,不指定则默认日志器名称为root。

创建的logger对象可以设置日志级别,添加日志处理器及过滤器,设置完成后即可创建日志记录。

logger.setLevel(level=logging.INFO)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
logger.addHandler(handler)
# handler为下方创建的处理器名称
logger.debug()
logger.info()
logger.warning()
logger.error()
logger.critical()

handlers类

handlers类属于基类,它提供了一些子类可以直接应用,方便定义不同的日志输出位置,下面列举四个常用的子类。

类名 作用
logging.StreamHandler 将日志直接发送到Stream,例如控制台
logging.FileHandler 将日志发送到磁盘文件,默认会无限增大
logging.handlers.RotatingFileHandler 将日志发送到磁盘文件,支持按大小切割文件
logging.hanlders.TimedRotatingFileHandler 将日志发送到磁盘文件,支持按时间切割文件
创建一个处理器对象

选择一个比较常用,即以创建可按照时间切割的处理器对象为例进行实现。

from logging.handlers import TimedRotatingFileHandler
handler=TimedRotatingFileHandler(filename=file,when='D',interval=1,backupCount=7)

其中,filename为输出的日志文件位置;
when代表切割单位,周(W),天(D),时(H),每天凌晨(midnight)等;
interval代表切割间隔,上述代码为1天切割为1个文件;
backupCount为最多保存的日志文件个数,超过即会删除最早创建的文件。

处理器对象配置

处理器对象同样可以设置日志级别、日志格式以及添加过滤器。

level=logging.INFO
handler.setLevel(level)
# 设定日志器的级别为INFO,大于等于该级别的日志均会输出
handler.setFormatter(format)
# format为下方Formatter类的实例化对象

Formatter类

logging模块的Formatter类主要用于自定义日志的输出格式。

log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
format=logging.Formatter(log_format)

Filter类

可以用于指定仅显示符合规则的日志,比如日志器name为test的日志才会被输出到文件。
目前我没有应用这个,所以就先不举例了~

logging应用

首先,建立一个日志初始化文件,创建日志器及对应的处理器。下方主要有两个处理器,一个实现向指定文件中以时间切割的方式输出日志,另一个实现直接在控制台输出日志。

#log.py
import logging
import os
from logging.handlers import TimedRotatingFileHandler

basepath = os.path.abspath(os.path.dirname(__file__))
log_level = logging.DEBUG
log_format = '%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s'
log_file = os.path.join(basepath, 'log', 'log.txt')

def log_init():
    logger = logging.getLogger()  # 创建一个日志器
    logger.setLevel(level=log_level)  # 日志器的级别设置
    formatter = logging.Formatter(log_format)  # 日志格式

    handler = TimedRotatingFileHandler(filename=log_file, when='D', interval=1, backupCount=7)  # 创建一个按时间切割文件的处理器
    handler.setLevel(log_level)  # 处理器的级别设置
    handler.setFormatter(formatter)  # 处理器的格式
    logger.addHandler(handler)  # 给日志器增加处理器

    console = logging.StreamHandler()
    # 创建向控制台输出日志内容的第二个处理器
    console.setLevel(log_level)
    console.setFormatter(formatter)
    logger.addHandler(console)

在其他文件中,引用上述文件方法并进行初始化,定义日志器,打印日志。

test01.py
import logging
from log import log_init
import time

log_init()
logger = logging.getLogger('t01')
logger.info('log test')
t = time.strftime('%Y%m%d_%H%M%S', time.localtime())
print(t)

运行test01文件,控制台输出结果如图:


控制台输出结果

日志文件如图:


log.txt

以上,就实现了初步的日志打印,至于在日志中如何打印出代码中的变量等等,还需要下一步学习,我们下次见~

自我记录,有错误欢迎指正~

上一篇下一篇

猜你喜欢

热点阅读