python将logging模块封装成单独模块并实现动态切换Level方式

yizhihongxing

一、背景
在Python中,logging模块是非常常用的标准库,用于实现应用的日志记录。logging模块提供了丰富的功能,可以配置logger、handler、formatter等参数,也支持多线程、多进程、日志旋转等高级需求。不过,logging模块也存在一些问题,例如默认日志级别是WARNING,不太方便打印出DEBUG和INFO级别的信息;另外,当需要打印出DEBUG和INFO级别的信息时,需要修改代码中的日志级别参数,重新运行程序才能生效。这些问题可以通过将logging模块进行封装,并实现动态切换Level方式来解决。

二、思路
将logging模块封装成单独模块,需要定义三个类:Logger、Handler、Formatter。Logger类用于定义log输出的方式(如console或file),Handler类用于定义log输出的格式(如log格式和时间格式),Formatter类用于定义log输出的级别(如DEBUG、INFO、WARNING、ERROR、CRITICAL)。通过在Logger中设定level属性,可以对整个Logger对象设置级别。通过设置Handler的级别,可以对指定Handler对象设置级别。通过设置Formatter的级别,可以对log输出的消息内容进行过滤。

三、步骤
1.定义Logger类
Logger类中定义了两个方法:设置日志输出方式和设置日志输出级别。下面是Logger的定义示例:

import logging
import sys

class Logger(object):
    def __init__(self, name):
        self.logger = logging.getLogger(name)
        self.logger.setLevel(logging.DEBUG)

    def addConsoleHandler(self, format):
        handler = logging.StreamHandler(sys.stdout)
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(logging.Formatter(format))
        self.logger.addHandler(handler)

    def addFileHandler(self, file, format):
        handler = logging.FileHandler(filename=file, mode='a', encoding='utf-8')
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(logging.Formatter(format))
        self.logger.addHandler(handler)

    def setLevel(self, level):
        self.logger.setLevel(level)

2.定义Handler类
Handler类中定义了两个方法:设置日志输出格式和设置日志时间格式。下面是Handler的定义示例:

import logging

class Handler(object):
    def __init__(self, format):
        self.format = format

    def setFormat(self, format):
        self.format = format

    def setDateFormat(self, datefmt):
        self.format.datefmt = datefmt

3.定义Formatter类
Formatter类中定义了过滤日志输出级别的方法。下面是Formatter的定义示例:

import logging

class Formatter(logging.Formatter):
    def __init__(self, fmt=None, datefmt=None, level=logging.DEBUG):
        logging.Formatter.__init__(self, fmt, datefmt)
        self.level = level

    def format(self, record):
        if record.levelno >= self.level:
            return logging.Formatter.format(self, record)
        else:
            return ''

4.动态切换Level方式
在主程序中,调用Logger类、Handler类、Formatter类,设置日志输出方式、日志输出格式和日志输出级别,即可实现动态切换Level方式。下面是示例代码:

import logging
import time

from mylogging import Logger, Handler, Formatter

if __name__ == '__main__':
    logger = Logger('mylogger')
    logger.addConsoleHandler('[%(asctime)s] [%(levelname)s] %(message)s')
    logger.addFileHandler('mylog.txt', '[%(asctime)s] [%(levelname)s] %(message)s')

    formatter1 = Formatter('[%(asctime)s] [%(levelname)s] %(message)s', level=logging.INFO)
    formatter2 = Formatter('[%(asctime)s] [%(levelname)s] %(message)s', level=logging.DEBUG)

    print('INFO logging...')
    logger.setLevel(logging.INFO)
    handler = logger.logger.handlers[-1]
    handler.setFormatter(formatter1)
    logger.logger.info('info message')

    time.sleep(1)

    print('DEBUG logging...')
    logger.setLevel(logging.DEBUG)
    handler.setFormatter(formatter2)
    logger.logger.debug('debug message')

运行结果:

INFO logging...
[2021-09-10 19:08:03,759] [INFO] info message

DEBUG logging...
[2021-09-10 19:08:04,765] [DEBUG] debug message

解析:
- Logger类定义了mylogger的Logger,设定日志输出级别为Debug。
- 通过addConsoleHandler()方法,将日志输出到控制台,格式为'[%(asctime)s] [%(levelname)s] %(message)s',级别设为Debug。
- 通过addFileHandler()方法,将日志输出到mylog.txt文件,格式为'[%(asctime)s] [%(levelname)s] %(message)s',级别设为Debug。
- 定义了两个Formatter,格式相同,但级别分别为Info和Debug。
- 通过setLevel()方法,将日志输出级别设为Info,此时只会将大于等于Info级别的日志输出。设置handler的Formatter为formatter1。
- 输出Info级别的日志。
- 通过setLevel()方法,将日志输出级别设为Debug,此时会将所有日志输出。设置handler的Formatter为formatter2。
- 输出Debug级别的日志。

四、总结
日志是编写Python应用程序时必不可少的组成部分。利用logging模块进行日志记录可以帮助我们快速定位问题,并找到解决办法。在实际使用过程中,对logging模块进行封装,以实现动态切换Level方式,可以提高debug的效率,降低调试成本。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python将logging模块封装成单独模块并实现动态切换Level方式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Python语言异常处理测试过程解析

    当我们编写Python程序时,无法避免地会遇到各种各样的异常(错误)。在这种情况下,我们需要使用异常处理来处理这些异常。在本文中,我将向读者们提供一份完整的Python语言异常处理测试过程解析攻略。 1. 异常处理的基本语法 在Python中,异常处理通常使用try…except结构。其基本语法如下: try: # 程序代码 except Expecti…

    python 2023年6月7日
    00
  • 详解Python中映射类型(字典)操作符的概念和使用

    详解Python中映射类型(字典)操作符的概念和使用 在Python中,字典(dictionary)是一种映射类型(mapping type),它是一组以 key-value 形式存储的数据结构。在字典中,每一个 key 都唯一地对应一个 value。 字典的基本操作 创建字典 可以使用大括号 {} 或 dict 函数来创建字典。例如: # 使用大括号创建空…

    python 2023年5月13日
    00
  • Python连接mssql数据库编码问题解决方法

    Python连接mssql数据库编码问题解决方法 在使用Python连接Microsoft SQL Server (MSSQL)数据库时,可能会遇到编码问题。通常情况下,我们需要解决以下两种编码问题: 数据库编码问题:某些情况下我们需要更改数据库编码以适配Python的默认编码。 查询结果编码问题:查询结果包含了特殊字符时,需要指定字符集编码。 下面我们将详…

    python 2023年5月20日
    00
  • linux修改tomcat默认访问项目的具体步骤(必看篇)

    下面是详细讲解“Linux修改Tomcat默认访问项目的具体步骤”的攻略: 1. 查找Tomcat的配置文件 在Linux中,默认安装路径下Tomcat的配置文件位于/etc/tomcat目录下。在该目录下,有一个名为server.xml的文件,为Tomcat的主配置文件。 2. 修改Tomcat的配置文件 打开server.xml文件并查找<Host…

    python 2023年6月3日
    00
  • Python多线程处理实例详解【单进程/多进程】

    Python多线程处理实例详解【单进程/多进程】 什么是多线程? 在操作系统中,进程是分配资源的基本单位,而线程则是进程中执行代码的单位。 一个进程中可以包含多个线程,每个线程共享进程的内存和资源,但是每个线程也有各自的执行堆栈和局部变量,从而实现并发执行。 Python中的多线程实现 Python中使用threading模块实现多线程。 使用Thread类…

    python 2023年5月18日
    00
  • pytorch 把MNIST数据集转换成图片和txt的方法

    那我来详细讲解一下“pytorch 把MNIST数据集转换成图片和txt的方法”的完整攻略。 准备工作 在开始操作之前,需要先准备MNIST数据集和执行转换的代码文件。MNIST数据集可以在网上下载,或者使用pytorch中自带的torchvision.datasets获取。代码文件可以使用常见的文本编辑器编写,如Notepad、Sublime Text、V…

    python 2023年5月19日
    00
  • Python如何实现文本转语音

    一、Python如何实现文本转语音 Python中实现文本转语音,需要安装第三方库Text-to-Speech(TTS)。 安装TTS库 TTS库有多种,以下列出几个比较流行的TTS库: pyttsx3,支持多个TTS引擎,支持Python 2和3,支持多种操作系统。 gTTS,使用谷歌TTS引擎,支持Python 2和3,需要联网。 pyttsx,支持多个…

    python 2023年5月19日
    00
  • python列表操作使用示例分享

    Python列表操作使用示例分享 在Python中,列表是一种常见的数据类型,可以存储多个元素。Python提供了丰富的列表操作方法,包括添加、删除、修改、排序等。本攻略将详细介绍Python中列表操作的使用方法,并提供多个示例说明。 创建列表 在Python中,可以使用方括号[]或list()函数来创建一个列表。以下是一个示例代码,演示如何创建一个列表: …

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部