赞
踩
日志主要用于记录程序运行情况,以便程序报错能够快速定位到问题。Python自带日志操作模块,即logging模块。
日志有6个等级,等级由低到高分别是NOTEST<DEBUG<INFO<WARING<ERROR<CRITICAL。其中DEBUG记录最详细的内容,WARING是默认的级别。如果需要更改日志级别,则需要手动修改日志级别。代码如下:
logging.basicConfig(level=logging.DEBUG)
日志输出格式的设置需要用到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 | 用于指定输出日志内容,例如日志发生时间 |
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 | 调用日志输出函数的函数名 |
在项目中通过日志统一配置,不仅能够实现将程序日志统一记录在同一个文件中,也能够实现在记入文件的同时,在终端也打印日志,还能够实现将错误日志单独错误日志文件。Logging模块可以分为logger、handler、formatter和fiter4个部分,4部分的层级结构为:
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的日志级别也同时改变了。
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级别日志")
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级别日志")
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级别日志内容。
- # 导入日志模块
- 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)
- 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级别的日志')
控制台输出结果为:
- 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级别的日志信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。