python你必须熟悉的包:logging日志模块

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在我们的python项目中,log日志是一个必不可缺的模块。我们需要将一些重要的运行数据保存下来,方便后期的问题排查。通常来说我们会将log保存至文件中,再进行后续的归档和查阅。python保存log用到最多的工具就是logging模块了,这里介绍下logging的使用吧。

前言

在我们的python项目中,log日志是一个必不可缺的模块。我们需要将一些重要的运行数据保存下来,方便后期的问题排查。通常来说我们会将log保存至文件中,再进行后续的归档和查阅。python保存log用到最多的工具就是logging模块了,这里介绍下logging的使用吧。

logging安装及简单使用

直接输入 pip install logging安装。 来个最简单的使用例子:

importlogginglogging.info("hello")
复制代码

配置项

配置logging的方式主要有3种:

  1. 使用ini文件配置
  2. 使用字典或JSON文件配置
  3. 直接通过源码配置

通常来说,因为源码配置的方式方便封装和自定义,因此我们多采用第3种方式来配置。

日志级别

日志的输出默认有以下几个级别:

级别 数值
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
NOSET 0
在生产项目中,一般我们只保存INFO以上级别的输出。

关键概念

主要的处理器有:

  • Logger记录器:暴露了应用程序代码直接使用的接口
  • Handler处理器:将日志落地到哪里的设置
  • Filter过滤器:提供更细的粒度控制输出哪些日志
  • Formatter格式化器:日志输出格式的设置

Handler处理器

常用的Handler处理器有StreamHandler、FileHandler、NullHandler。 项目中多使用FileHandler,示例:

logger = logging.getLogger()
filename = "log.log"
fileHandler = logging.FileHandler(filename, mode='a')
复制代码

在实际开发中,有些日志生成速度很快,如果日志都写到一个文件中,后续日志查询效率会大大降低。因此我们需要对日志文件进行切割。

logging模块支持按照时间切割、按照文件切割。

按照时间切割TimedRotatingFileHandler示例
logger = logging.getLogger()
file_name = "log.log"
timeHandler = logging.handlers.TimedRotatingFileHandler(
   file_name,
   when='D',  # 按照什么维度切割, S:秒,M:分,H:小时,D:天,W:周
   interval=1, # 多少天切割一次
   backupCount=10  # 保留几天
)
# 设置log文件后缀
timeHandler.suffix = "%Y-%m-%d.log"
logger.addHandler(timefilehandler)
复制代码
按照文件切割RotatingFileHandler示例
logger = logging.getLogger()
file_name = "log.log"
fileHandler = logging.handlers.RotatingFileHandler(
   file_name,
   maxBytes=300*1024*1024, # 当文件达到多大时切割,这里设置300M
   backupCount=10  # 保留几个log文件
)
# 设置log文件后缀
logger.addHandler(fileHandler)
复制代码

Formatter格式化器

使用Formatter可设置日志的输出格式,用法 formatter = logging.Formatter(fmt=None, datefmt=None) format格式释义:

  • %(levelno)s: 打印日志级别的数值
  • %(levelname)s: 打印日志级别名称
  • %(pathname)s: 打印当前执行程序的路径
  • %(filename)s: 打印当前执行程序名称
  • %(funcName)s: 打印日志的当前函数
  • %(lineno)d: 打印日志的当前行号
  • %(asctime)s: 打印日志的时间
  • %(thread)d: 打印线程id
  • %(threadName)s: 打印线程名称
  • %(process)d: 打印进程ID
  • %(message)s: 打印日志信息

示例:

formatter = logging.Formatter(
    fmt='%(asctime)s | %(name)s | %(levelname)s | %(message)s', 
    datefmt='%Y-%m-%d %H:%M:%S'
)
复制代码

打印一个看看:

$ 2022-08-19 17:45:17 | test | INFO | 测试log
复制代码

配置示例

import logging
import logging.handlers
logger = logging.getLogger('test')
# 设置日志等级
logger.setLevel(logging.INFO)
# 创建文件处理器
log_file_path = "./log.log"
fileHandler = logging.handlers.RotatingFileHandler(
   log_file_path,
   maxBytes=300*1024*1024, 
   backupCount=10  
)
# 格式化输出设置
formatter = logging.Formatter('%(asctime)s|%(name)s | %(levelname)s | %(message)s')
fileHandler.setFormatter(formatter)
logger.addHandler(fileHandler)
# 测试
logger.info("info msg")
复制代码

小结

logging包是python使用最多的日志模块,我们在使用时,根据自身需要来自定义配置。我们在一些日志查询高频的情景下,可结合其他工具比如elasticsearch、kibana等来快速查询。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
195 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
3月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
156 62
|
1月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
54 7
|
27天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
103 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
2月前
|
Python
Python Internet 模块
Python Internet 模块。
131 74
|
3月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
141 63
|
3月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
3月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
133 61
|
3月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
3月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。

热门文章

最新文章