写点什么

Python 还不会用日志模块?本文给你答案

  • 2022-10-16
    广东
  • 本文字数:1569 字

    阅读完需:约 1 分钟

前言

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

logging 安装及简单使用

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


import logginglogging.info("hello")
复制代码

配置项

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


  1. 使用 ini 文件配置

  2. 使用字典或 JSON 文件配置

  3. 直接通过源码配置


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

日志级别

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


关键概念

主要的处理器有:


  • 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 loggingimport 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 等来快速查询。

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020-06-16 加入

还未添加个人简介

评论

发布
暂无评论
Python还不会用日志模块?本文给你答案_python 3.5+_芥末拌个饭吧_InfoQ写作社区