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

一、背景
在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 对excel交互工具的使用详情

    下面我将详细讲解Python对Excel交互工具的使用详情的完整实例教程。 Python对Excel交互工具的使用 Python对Excel交互工具的主要功能是对Excel表格进行读写、数据处理和操作等操作,其能够使用Python编程语言的特性快速、高效地完成Excel表格数据的处理和分析。 在Python中,使用openpyxl第三方库来进行Excel交互…

    python 2023年5月13日
    00
  • python实现ftp文件传输功能

    下面我将详细讲解如何用Python实现FTP文件传输功能。 准备工作 首先,需要安装ftplib模块。如果你使用的是Python3,那么ftplib模块已经内置在Python中。如果使用的是Python2,需要通过pip install ftplib来安装。 连接FTP服务器 在Python程序中,要连接FTP服务器,需要先创建一个FTP对象,并调用其con…

    python 2023年6月3日
    00
  • Python全栈之递归函数

    Python全栈之递归函数攻略 什么是递归函数 递归是一种算法,它通过调用自身解决问题。在 Python 中,递归函数是一个自己调用自己的函数。 递归函数通常包括两部分: 基线条件:确定递归何时结束,避免无限循环。 递归条件:定义如何调用自身函数,使问题规模不断减小。 递归函数的书写 使用递归函数需要注意以下几点: 需要一个明确的基线条件。 每次递归调用都必…

    python 2023年6月5日
    00
  • python中复数的共轭复数知识点总结

    python中复数的共轭复数知识点总结 1. 什么是共轭复数? 共轭复数(Conjugate complex number)是指将复数的虚部取负成为另一个复数。例如,复数 a+bi 的共轭复数是 a-bi。共轭复数通常用字母 bar 表示,即 a+bi 的共轭复数可以表示为 a-bi 或 bar(a+bi)。 2. python中复数的共轭复数函数 在pyt…

    python 2023年6月5日
    00
  • python错误:AttributeError: ‘module’ object has no attribute ‘setdefaultencoding’问题的解决方法

    当使用Python 2.x版本时,可能会出现”AttributeError: ‘module’ object has no attribute ‘setdefaultencoding'”错误。这是由于Python 2.x中默认的字符集编码是ASCII,而Python 3.x中默认的字符集编码是UTF-8。 解决方法一:在代码文件的开头添加以下内容: impo…

    python 2023年6月3日
    00
  • python多线程的线程如何安全实现

    在Python中,多线程的实现需要考虑线程安全的问题。线程安全是指当多个线程访问同一组共享的资源时,不会出现不合理的结果。为了保证线程安全,Python提供了多种线程同步机制,如互斥锁、信号量、条件变量等。 下面分两个示例说明如何安全实现Python的多线程。 1. 互斥锁的使用示例 互斥锁(mutex)是一种最基本的线程同步机制,它能够保证同一时间内只有一…

    python 2023年5月19日
    00
  • 搞定这套Python爬虫面试题(面试会so easy)

    首先要明确一点,这个题目指的是Python爬虫面试题,针对爬虫相关的知识点进行考察。因此,在回答这个问题之前,我们需要明确爬虫相关的知识点,以及如何准备这方面的面试。 一、爬虫知识点: 在准备爬虫面试之前,需要掌握以下知识点: HTTP协议:了解HTTP常见状态码和请求方法,如200、404、GET、POST等。 HTML:理解HTML的基本结构和语法规则,…

    python 2023年5月14日
    00
  • python 使用多线程创建一个Buffer缓存器的实现思路

    下面是详细讲解“Python使用多线程创建一个Buffer缓存器的实现思路”的攻略。 1. 概述 在Python中,通过多线程创建一个Buffer缓存器可以提高程序的处理能力。缓存器是一种高效的技术手段,主要用于缓存应用程序所需的数据,减少网络请求或文件读取等的开销,从而提高应用程序的响应速度。 2. 实现思路 Python中可以使用queue模块来实现Bu…

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