Python中的logging模块解析

本文详细介绍了Python中的logging模块,包括其四大核心组件:logger、handler、filter和formatter的功能与用法。并通过实例展示了如何创建日志器、设置日志级别、配置日志输出格式,以及如何通过封装实现更高效的日志管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在自动化测试中,为了定位问题,调试框架代码,需要使用日志模块,今天我们重点讲解Python中的logging模块,在学习使用logging模块前,我们先要了解logging模块的四大天王:logger、handler、filter、formatter

一.logging模块的四大组件

logger:日志器,提供程序可使用的接口

handler:处理器,用于写入日志文件并输出到指定位置,如文件、控制台或网络等

filter:过滤器,用于输出符合指定条件的日志记录

formatter:格式器,决定日志记录的输出格式

二.如何使用logging模块---基本用法

1.创建logger对象,返回一个日志器

logger = logging.getlogger()

2.设置日志等级

logger.setLevel("DEBUG") #设置日志等级为debug

常见的日志级别有:DEBUG、INFO、WARNING、ERROR、CRITICAL,具体用法如下:

DEBUG:最低级别,追踪问题时使用

INFO:记录程序中一般事件的信息,或确认一切工作正常

WARNING:记录信息,用于警告

ERROR:用于记录程序报错信息

CRITICAL:最高级别,记录可能导致程序崩溃的错误

3.创建一个处理器对象

fh = logging.FileHandler(filename="bbb.log", mode='a', encoding="utf-8", delay=False) #创建一个文件处理器,日志输入文件,需要指定文件名称,写入的模式,编码格式等

4.创建一个格式器对象

fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(pathname)s]-[Line:%(lineno)d]-[LoggerInfo:%(message)s]") #一般格式器中要定义好日志产生时间,日志级别,产生日志的模块全路径,模块的哪一行,具体的日志信息等

5.为处理器添加格式

fh.setFormatter(fmt=fmt),将第4步中生成的格式器给第3步生成的处理器“吞吃”

6.为日志器添加处理方式

logger.addHandler(fh),将设置格式后的处理器对象给日志器“吞吃”,使日志器有处理日志的能力

7.调用日志器对象,生成日志

logger.debug("这是一个debug错误")

8.源码如下:

import logging #导入日志模块
logger = logging.getLogger() #创建日志器logger.setLevel(logging.DEBUG) #设置日志的打印级别fh = logging.FileHandler(filename="kkk.log",mode='a',encoding="utf-8") #创建日志处理器,用文件存放日志sh = logging.StreamHandler()#创建日志处理器,在控制台打印#创建格式器,指定日志的打印格式fmt = logging.Formatter("[%(asctime)s]-[%(levelname)s]-[%(filename)s]-[Line:%(lineno)d]-[Msg:%(message)s]")#给处理器设置格式fh.setFormatter(fmt=fmt)sh.setFormatter(fmt=fmt)#给日志器添加处理器logger.addHandler(fh)logger.addHandler(sh)#调用日志器logger.debug("ajffasfdsas")

三.优化

上面的日志的基本用法,没有做封装,实际工作中使用不方便,我们接下来将其进行封装,方便需要使用时,进行调用,同时将具体包括将日志按日期分别存放到不同的文件,日志名称以时间命名;具体方法如下:​​​​​​​

import logging,os,time
class Logging():
    def make_log_dir(self,dirname='logs'): #创建存放日志的目录,并返回目录的路径        now_dir = os.path.dirname(__file__)        father_path = os.path.split(now_dir)[0]        path = os.path.join(father_path,dirname)        path = os.path.normpath(path)        if not os.path.exists(path):            os.mkdir(path)        return path
    def get_log_filename(self):#创建日志文件的文件名格式,便于区分每天的日志        filename = "{}.log".format(time.strftime("%Y-%m-%d",time.localtime()))        filename = os.path.join(self.make_log_dir(),filename)        filename = os.path.normpath(filename)        return filename
    def log(self,level='DEBUG'):#生成日志的主方法,传入对那些级别及以上的日志进行处理        logger = logging.getLogger()#创建日志器        levle = getattr(logging,level) #获取日志模块的的级别对象属性        logger.setLevel(level)#设置日志级别        if not logger.handlers: #作用,防止重新生成处理器            sh = logging.StreamHandler()#创建控制台日志处理器            fh = logging.FileHandler(filename=self.get_log_filename(),mode='a',encoding="utf-8")#创建日志文件处理器            #创建格式器            fmt = logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-Line:%(lineno)d-Message:%(message)s")            #给处理器添加格式            sh.setFormatter(fmt=fmt)            fh.setFormatter(fmt=fmt)            #给日志器添加处理器,过滤器一般在工作中用的比较少,如果需要精确过滤,可以使用过滤器            logger.addHandler(sh)            logger.addHandler(fh)        return logger #返回日志器
if __name__ == '__main__':    logger = Logging().log(level='DEBUG') #调用封装的日志方法,生成处理后的日志器    logger.debug("1111111111111111111111") #使用日志器生成日志    logger.info("222222222222222222222222")    logger.error("附件为IP飞机外婆家二分IP文件放")    logger.warning("3333333333333333333333333333")    logger.critical("44444444444444444444444444")

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走


这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…..关注下方我的微信公众号【程序员小濠】免费获取~

### Python `logging` 模块简介 Python 的 `logging` 模块提供了一种灵活且强大的机制来记录应用中的事件信息。通过该模块,开发者能够轻松地将不同严重程度的消息写入到不同的目的地,比如控制台、文件甚至是远程服务器。 #### 基本设置与使用方法 为了开始使用 `logging` 模块,在脚本顶部导入必要的库并配置基础的日志参数是非常重要的。下面的例子展示了怎样快速启动和运行一个简单的日志系统: ```python import logging # 配置日志输出格式及最低级别 logging.basicConfig( level=logging.DEBUG, format="%(asctime)s %(name)-12s %(levelname)-8s %(message)s", datefmt="%m-%d %H:%M" ) # 记录不同类型的信息 logging.debug('这是一个调试消息') logging.info('这是提示性信息') logging.warning('警告发生了 (但不是非常严重)') logging.error('发生了一个错误!') logging.critical('致命性的内部错误!!!') ``` 这段代码设置了全局的日志格式,并指定了最小可见的日志级别为 DEBUG 。这意味着所有等于或高于此级别的日志都会被显示出来[^2]。 #### 进阶功能:多处理器支持 对于更复杂的应用场景来说,可能需要同时向多个地方发送相同或不同的日志条目。这可以通过定义额外的处理器 (`Handler`) 来实现。例如,如果希望既能在终端看到实时反馈又可以把所有的 ERROR 和 CRITICAL 级别的日志保存在一个单独的日志文件里,则可以这样做: ```python import os from pathlib import Path import logging.handlers log_dir = './logs' Path(log_dir).mkdir(parents=True, exist_ok=True) console_handler = logging.StreamHandler() file_handler = logging.FileHandler(os.path.join(log_dir,'error.log')) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setLevel(logging.ERROR) # 只有ERROR及以上才会进入这个handler file_handler.setFormatter(formatter) logger = logging.getLogger(__name__) logger.addHandler(console_handler) logger.addHandler(file_handler) logger.error("An error occurred.") ``` 这里创建了两个处理器实例分别指向标准输出流(即命令行界面)和磁盘上的特定路径下的文件。注意给定的日志器对象只会在其关联的所有处理器中转发那些满足各自设定条件的日志项[^3]。 #### 定时轮转日志文件 当项目规模增大时,可能会遇到单个日志文件增长过快的问题。为了避免这种情况的发生,可以利用定时旋转的方式定期归档旧的日志数据。如下所示是如何基于时间间隔自动分割日志文件的一个例子: ```python import datetime import logging.handlers rf_handler = logging.handlers.TimedRotatingFileHandler( 'app.log', when='midnight', # 或者其他单位如'S'(秒), 'M'(分钟),'H'(小时) interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0), encoding='utf-8' ) rf_handler.suffix = "%Y%m%d" logger = logging.getLogger(__name__) logger.addHandler(rf_handler) for _ in range(10): logger.info(f"Logging some information {_}") ``` 上述片段实现了每天凌晨零点整对当前正在使用的日志文件进行切割操作,并保留最近七天的历史副本[^5]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值