python日志模块logging
【摘要】 在我们的python项目中,log日志是一个必不可缺的模块。我们需要将一些重要的运行数据保存下来,方便后期的问题排查。通常来说我们会将log保存至文件中,再进行后续的归档和查阅。python保存log用到最多的工具就是logging模块了,这里介绍下logging的使用吧。
前言
在我们的python项目中,log日志是一个必不可缺的模块。我们需要将一些重要的运行数据保存下来,方便后期的问题排查。通常来说我们会将log保存至文件中,再进行后续的归档和查阅。python保存log用到最多的工具就是logging模块了,这里介绍下logging的使用吧。
logging安装及简单使用
直接输入 pip install logging
安装。 来个最简单的使用例子:
import logging
logging.info("hello")
配置项
配置logging的方式主要有3种:
- 使用ini文件配置
- 使用字典或JSON文件配置
- 直接通过源码配置
通常来说,因为源码配置的方式方便封装和自定义,因此我们多采用第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等来快速查询。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)