一、logging模块
就是python里面用来操作日志的模块,logging模块中主要有4个类,分别负责不同的工作
1. Logger 记录器,暴露了应用程序代码能直接使用的接口;简单点说就是一个创建一个办公室,让人在里头工作
2. Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地;这个简单点说就是办事的人,你可以指定是让它控制输出日志,或者在文件里面打印日志,
2.1 常用的有4种:StreamHandler 控制台输出
FileHandler 文件输出
下面两种需要导入
handlers,通过from logging import handlers导入
TimedRotatingFileHandler按照时间自动分割日志文件
RotatingFileHandler 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
3. Filter过滤器,提供了更好的粒度控制,它可以决定输出哪些日志记录。(不常用)
4. Formatter格式化器,指明了最终输出中日志记录的布局。指定输出日志的格式
二、日志级别
debug < info < warning < error < critical
设置了日志级别之后,会打印该级别以及比该级别高的所有日志,举个例子,如果日志级别是warning,那么就会打印warning、error、critical,这三个级别的日志,
不会打印debug和info级别的,如果是debug,最低级别的日志,那么所有的日志都会打印。
下面通过一个实例来实现既产生日志文件,也在控制台输出日志:
1 import logging 2 from logging import handlers 3 logger = logging.getLogger()#先实例化一个logger对象,先创建一个办公室 4 logger.setLevel(logging.DEBUG)#设置日志的总级别 5 cl = logging.StreamHandler()#创建一个控制台输出的处理器,负责往控制台输出的,这两个就是上面说的Handler 6 bl = handlers.TimedRotatingFileHandler(filename='a.log',when='S',interval=1,backupCount=3,encoding='utf-8') 7 #指定间隔时间自动生成文件的处理器 8 #interval是时间间隔,backupCount是备份文件的个数,如果超过这个超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种: 9 # S 秒 10 # M 分 11 # H 小时、 12 # D 天、 13 # W 每星期(interval==0时代表星期一) 14 # midnight 每天凌晨 15 fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')#指定日志的格式 16 cl.setFormatter(fmt)#设置控制台输出的日志格式 17 bl.setFormatter(fmt)#设置文件里面写入日志格式 18 19 logger.addHandler(cl)#将已经设置好的人,添加到办公室 20 logger.addHandler(bl)#将已经设置好的人,添加到办公室 21 22 logger.debug('我是debug...') 23 logger.warning('我是warning...')
也可以封装一个写日志的类
1 import logging 2 from logging import handlers 3 class MyLogger(): 4 def __init__(self,file_name,level=logging.INFO,backCount=5,when='D'): 5 logger = logging.getLogger()#先实例化一个logger对象,先创建一个办公室 6 logger.setLevel(self.get_level(level))#设置日志的级别 7 cl = logging.StreamHandler()#负责往控制台输出的 8 bl = handlers.TimedRotatingFileHandler(filename=file_name,when=when,interval=1,backupCount=backCount,encoding='utf-8') 9 #when='S'按什么单位,S秒,M分,H小时,D天,W每星期,隔多久生成一个 10 fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')#指定日志的格式 11 cl.setFormatter(fmt)#设置控制台输出的日志格式 12 bl.setFormatter(fmt)#设置文件里面写入日志格式 13 logger.addHandler(cl)#将已经设置好的人,添加到办公室 14 logger.addHandler(bl)#将已经设置好的人,添加到办公室 15 self.logger=logger 16 17 def get_level(self,str): 18 level = { 19 'debug':logging.DEBUG, 20 'info':logging.INFO, 21 'warn':logging.WARNING, 22 'error':logging.ERROR 23 } 24 str=str.lower() 25 return level.get(str) 26 27 lw_log = MyLogger('lw.log') 28 lw_log.logger.warning('哈哈哈')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构