Python日志模块详解及应用
日志主要用于记录程序运行情况,以便程序报错能够快速定位到问题。Python自带日志操作模块,即logging模块。
一、Logging模块
1、日志等级划分及作用
日志有6个等级,等级由低到高分别是NOTEST<DEBUG<INFO<WARING<ERROR<CRITICAL。其中DEBUG记录最详细的内容,WARING是默认的级别。如果需要更改日志级别,则需要手动修改日志级别。代码如下:
logging.basicConfig(level=logging.DEBUG)
2、日志输出格式设置
日志输出格式的设置需要用到basicConfig方法,基础使用代码如下:
LOG_FORMAT = "%(asctime)s-(message)s"
logging.basicConfig(filename='log_test.log',
level=logging.DEBUG,
encoding='utf-8',
datefmt='%Y-%m-%d %H:%M:%S',
format = LOG_FORMAT)
basicConfig方法具有多个属性,具体如下:
参数名称 |
说明 |
Filename |
指日志要输出到指定的文件 |
Filemode |
指打开文件的方式,默认为‘a’,追加写入 |
Datefmt |
用于指定日期/时间格式 |
Level |
用于指定日志级别 |
Encoding |
用于指定输出日志编码格式 |
Format |
用于指定输出日志内容,例如日志发生时间 |
3、Format参数值
Format参数值具有多种配置格式,配置内容间使用连接符进行连接,可支持自定义。常用值列表:
名称 |
说明 |
%(name)s |
logger 的名字 |
%(asctime)s |
日志时间,注意可以datefmt参数设置格式 |
%(message)s |
日志信息 |
%(filename)s |
执行程序文件名 |
%(pathname)s |
执行程序路径名 |
%(process)d |
进程id |
%(thread)d |
线程id |
%(threadName)s |
线程名称 |
%(levelno)s |
日志级别数值 |
%(levelname)s |
日志级别名称 |
%(lineno)d |
调用代码所在行 |
%(module)s |
调用日志输出函数的模块 |
%(funcName)s |
调用日志输出函数的函数名 |
4、日志进阶
在项目中通过日志统一配置,不仅能够实现将程序日志统一记录在同一个文件中,也能够实现在记入文件的同时,在终端也打印日志,还能够实现将错误日志单独错误日志文件。Logging模块可以分为logger、handler、formatter和fiter4个部分,4部分的层级结构为:
4.1 Logger:
Logger对象是应用程序代码与日志记录系统之间的接口,是日志记录的入口点,用于创建日志记录器。可以设置不同的日志级别。可以通过getlogger()获取logger对象,一般默认为root,也可以自定义。
import logging
# 默认root
logger1 = logging.getLogger()
# 设置日志级别为debug级别
logger1.level=logging.DEBUG
print(logger1)
# 结果值:<RootLogger root (DEBUG)>
# 自定义logger对象
logger2 = logging.getLogger(__name__)
print(logger2)
# 结果值:<Logger __main__ (DEBUG)>
logger很明显的缺点是无法多进程,例如给对象logger1设置日志级别,logger2的日志级别也同时改变了。
4.2 handler:
handler对象用于将日志记录发送到指定的位置,这个位置可以是控制台、文件、网络等。不同的handler负责将日志发送到不同的位置。常用的handler有StreamHandler(发送到控制台)、FileHandler(发送到文件)、SMTPHandler(发送到邮件)、HTTPHandler(通过HTTP发送日志)。
# 导入日志模块
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.3 Formatter:
Formatter用于设置日志输出最终格式,可以为每个handler设置不同Formatter。
# 导入日志模块
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 设置日志输出格式
formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug("这是一个从控制台输出的DEBUG级别日志")
4.4 Filter:
Filter(过滤器)用于决定日志内容是否被输出,可以依据各种标准,例如日志内容、日志级别、logger名称等。而且,每个handler可以设置多个Filter。
# 导入日志模块
import logging
logger = logging.getLogger('main')
logger.setLevel(logging.DEBUG)
print(logger)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
# 设置日志输出格式
formatter = logging.Formatter("%(asctime)s - %(message)s", datefmt='%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
# 定义 Filter 过滤器:判断给定字符 与 logger 的名称前缀是否匹配
# 默认全匹配,可选操作
flt = logging.Filter('main')
logger.addFilter(flt)
logger.debug("这是一个从控制台输出的DEBUG级别日志")
二、实例
设置三个handler,第一个输出到文件中,记录详细日志内容;第二个输出到控制台,记录详细日志内容;第三个输出到文件中,记录ERROR级别日志内容。
1、新建配置模块log_setting1.py
# 导入日志模块
import logging
def set_log_config(set_level):
# 得到logger对象
logger = logging.getLogger()
logger.setLevel(set_level)
# 设置第一个handler
info_handler = logging.FileHandler(filename='../settings/info_log.log', mode='a', encoding='utf-8')
logger.addHandler(info_handler)
# 设置第二个handler
stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
# 设置第三个handler
err_handler = logging.FileHandler(filename='../settings/err_log.log', mode='a', encoding='utf-8')
err_handler.setLevel(logging.ERROR)
logger.addHandler(err_handler)
# 设置输出格式
formatter = logging.Formatter(fmt='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
info_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
err_handler.setFormatter(formatter)
2、新建程序入口
import logging
from settings.log_setting1 import set_log_config
set_log_config('DEBUG')
logging.info('这是一个info级别的日志')
logging.debug('这是一个debug级别的日志')
logging.warning('这是一个warning级别的日志')
logging.error('这是一个error级别的日志')
3、输出结果
控制台输出结果为:
2024-06-28 17:17:35 - 这是一个info级别的日志
2024-06-28 17:17:35 - 这是一个debug级别的日志
2024-06-28 17:17:35 - 这是一个warning级别的日志
2024-06-28 17:17:35 - 这是一个error级别的日志
在指定目录下生成info_log.log和err_log.log文件,在info_log.log中与控制台输出内容一致;在err_log.log中仅展示ERROR级别的日志信息。
作者:会逃跑的乌龟