当前位置: 代码迷 >> 综合 >> Python 日志输出 logging
  详细解决方案

Python 日志输出 logging

热度:46   发布时间:2024-03-10 01:17:30.0

文章目录

  • Python Logging Module 日志模块
      • logging 日志流处理
        • logging 模块日志模块组件
        • logging 日志流处理流程
        • Loggers 日志器
        • Handlers 处理器
        • Filters 过滤器
        • Formatter 格式化器

Python Logging Module 日志模块


logging 日志流处理

Official tutorial

logging 模块日志模块组件

logging 模块的日志模块总共包含了四个组件:

  • 日志器 Loggers : 提供应用程序可以一直使用的接口,并且可以设置产生的日志等级等,日志产生之后,将会交给已注册的处理器进行处理

  • 处理器 Handlers :对 Logger 产生的日志进行处理 —— 通过相应的函数进行处理方式的设置,例如输出格式,以及输出的日志等级等

  • 过滤器 Filters :对将要输出的日志进行更好过滤以确定最终要输出的日志结果

  • 格式化器 Formatter :确定日志最终的输出格式

事实上,在一个应用程序的整个过程中,通过 Logger 类的实例进行日志处理和输出,这些实例通过一个命名空间的层级结构组织起来,每个命名空间和子空间之间通过 '.' 来分隔,例如:scan.textscan 这个 Logger 的子空间中,日志名根据需要可以任意定义。

显然,这种命名方式马上可以联想到 Python 模块的命名方式,所以官方文档中为我们提供的一种较好的命名方法就是通过模块的 __name__ 属性来进行命名,既可以实现不同层级的模块之间的命名空间组织,又使得每个日志输出都和对应的模块关联起来,方便进行日志查找和管理:

logger = logging.getLogger(__name__)

logging 日志流处理流程

官网的日志处理流程:
在这里插入图片描述

所以,日志流处理的四个组件的过程如下:

日志器 Logger
过滤器 Filter
处理器 Handler
格式化器 Formatter

通过 getLogger 函数来得到这个模块的日志器对象,然后通过 setLevel 和 addHandler 方法可以为这个日志器对象设置日志的输出等级以及日志输出的处理器:

# set log level
logger.setLevel(logging.DEBUG)# create handler
trf_handler = logging.TimedRotatingFileHandler()
logger.addHandler(trf_handler)

创建的日志器还可以设置相应的格式化器,来确定最终输出到文件的日志的格式:

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# add formatter to timed rotating file handler
trf_handler.setFormatter(formatter)

通过直接调用不同等级的日志输出函数,就可以得到对应格式和等级的日志输出:

logger.debug('This is debug')
logger.info('This is info')
logger.warn('This is warn')
logger.error('This is error')
logger.critical('This is critical')

Loggers 日志器

Handlers 处理器

常用的日志处理器:

  • FileHandler
  • TimedRotatingFileHandler

Filters 过滤器

Formatter 格式化器

  相关解决方案