«

python中logging模块简单和高级使用的方法是什么

时间:2024-6-8 09:49     作者:韩俊     分类: Python


本篇内容介绍了“python中logging模块简单和高级使用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    简单使用

    在 Python 中,可以使用内置的 logging 模块来记录应用程序的信息。最简单的用法是使用 basicConfig() 函数配置 logging 模块,然后使用 getLogger() 方法创建一个 Logger 对象,用于记录信息。下面是一个简单的例子:

    import logging
    
    # 配置 logging
    logging.basicConfig(level=logging.DEBUG)
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('这是一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们使用 basicConfig() 函数设置日志级别为 DEBUG(最详细的日志信息),然后使用 getLogger() 方法创建了一个 Logger 对象。接下来,我们使用 Logger 对象的不同方法记录不同级别的信息。日志级别的优先级从低到高依次是 DEBUG、INFO、WARNING、ERROR、CRITICAL。

    日志格式

    logging 模块支持自定义日志格式,可以使用 format 参数来指定日志格式。日志格式可以包括时间、日志级别、日志信息等。下面是一个自定义日志格式的例子:

    import logging
    
    # 配置 logging
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(levelname)s %(message)s')
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('这是一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们使用 format 参数指定了日志格式,其中 %(asctime)s 表示时间,%(levelname)s 表示日志级别,%(message)s 表示日志信息。

    输出到文件

    logging 模块支持将日志输出到文件中,可以使用 filename 和 filemode 参数来指定输出文件名和打开模式。下面是一个将日志输出到文件中的例子:

    import logging
    
    # 配置 logging
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(levelname)s %(message)s',
                        filename='app.log',
                        filemode='w')
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('这是一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们使用 filename 参数指定输出文件名为 app.log,使用 filemode 参数指定打开模式为 w(覆盖写入)。

    处理程序(Handler)

    logging 模块提供了处理程序(Handler)的概念,用于处理日志记录的输出。默认情况下,日志记录会输出到控制台。我们可以添加一个或多个处理程序来指定不同的日志输出方式。例如,可以将日志输出到文件、网络、数据库等。下面是一个将日志输出到文件和控制台的例子:

    import logging
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 创建控制台处理程序并设置日志级别
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    
    # 创建文件处理程序并设置日志级别
    file_handler = logging.FileHandler('app.log')
    file_handler.setLevel(logging.DEBUG)
    
    # 创建日志格式器
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    
    # 设置处理程序的日志格式器
    console_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)
    
    # 添加处理程序到 logger 对象
    logger.addHandler(console_handler)
    logger.addHandler(file_handler)
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('这是一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们创建了一个 Logger 对象,并添加了两个处理程序:一个控制台处理程序和一个文件处理程序。我们还创建了一个日志格式器,并将其设置为处理程序的格式器。然后,我们将处理程序添加到 Logger 对象中,最后记录了一些信息。由于控制台处理程序的日志级别设置为 INFO,因此调试信息不会输出到控制台。

    过滤器(Filter)

    logging 模块还提供了过滤器(Filter)的概念,用于对日志记录进行过滤。可以使用过滤器来控制哪些日志记录应该被处理,哪些不应该被处理。下面是一个使用过滤器的例子:

    import logging
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 创建控制台处理程序并设置日志级别
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    
    # 创建过滤器并设置过滤条件
    class CustomFilter(logging.Filter):
        def filter(self, record):
            return record.msg.startswith('警告')
    
    filter = CustomFilter()
    
    # 设置处理程序的过滤器
    console_handler.addFilter(filter)
    
    # 创建日志格式器
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    
    # 设置处理程序的日志格式器
    console_handler.setFormatter(formatter)
    
    # 添加处理程序到 logger 对象
    logger.addHandler(console_handler)
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('警告:这是一条警告信息')
    logger.warning('这是又一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们创建了一个 Logger 对象,并添加了一个控制台处理程序。我们还创建了一个过滤器,并将其设置为控制台处理程序的过滤器。过滤器的 filter()方法用于指定哪些记录应该被处理,它返回 True 或 False表示是否处理该记录。在这个例子中,我们创建了一个自定义过滤器 CustomFilter,用于只处理以“警告”开头的日志记录。

    高级使用

    除了上述介绍的基本用法外,logging 模块还提供了一些高级功能,如日志回溯、日志轮换、日志缓冲等。

    日志回溯

    logging 模块支持记录回溯信息,可以使用 exc_info 参数来记录当前异常的回溯信息。

    在 Python 中,当程序发生异常时,解释器会自动输出异常信息和回溯信息。异常信息通常包含异常类型和异常消息,回溯信息包含了程序执行时的堆栈信息,即函数调用栈的跟踪信息。回溯信息可以帮助开发人员定位程序错误的根源。

    日志回溯是使用 logging 模块记录程序发生的异常信息和回溯信息。可以使用 Logger 对象的 error()、exception() 或 critical() 方法来记录异常信息和回溯信息。这些方法会自动记录当前异常的类型、消息和回溯信息,无需额外的代码

    下面是一个记录回溯信息的例子:

    import logging
    
    # 配置 logging
    logging.basicConfig(level=logging.DEBUG)
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 记录信息和回溯信息
    try:
        1/0
    except Exception as e:
        logger.error('发生异常', exc_info=True)

    在上面的例子中,我们使用 exc_info=True 参数记录了当前异常的回溯信息。当发生异常时,日志记录将包括异常信息和回溯信息。

    2023-04-19 15:47:36,688 ERROR 发生异常
    Traceback (most recent call last):
      File "<ipython-input-1-728869f0c30f>", line 7, in <module>
        1/0
    ZeroDivisionError: division by zero

    日志轮换

    logging 模块支持日志轮换功能,可以将日志按时间或大小轮换到不同的文件中。

    日志轮换(Log Rotation)是指在日志文件大小达到一定值或一定时间间隔后,自动将当前日志文件备份并创建一个新的日志文件,以便管理和维护。日志轮换可以避免日志文件过大、影响系统性能和管理不便等问题。

    在 Python 的 logging 模块中,可以使用 logging.handlers 模块中的 RotatingFileHandler 和 TimedRotatingFileHandler 类来实现日志轮换功能。其中,RotatingFileHandler 类是按文件大小轮换日志文件,TimedRotatingFileHandler 类是按时间轮换日志文件。

    下面是一个按时间轮换日志的例子:

    import logging
    from logging.handlers import TimedRotatingFileHandler
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 创建按时间轮换的文件处理程序
    handler = TimedRotatingFileHandler('app.log', when='midnight', backupCount=7)
    
    # 创建日志格式器
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    
    # 设置处理程序的日志格式器
    handler.setFormatter(formatter)
    
    # 添加处理程序到 logger 对象
    logger.addHandler(handler)
    
    # 记录信息
    logger.debug('这是一条调试信息')
    logger.info('这是一条普通信息')
    logger.warning('这是一条警告信息')
    logger.error('这是一条错误信息')
    logger.critical('这是一条严重错误信息')

    在上面的例子中,我们创建了一个按时间轮换的文件处理程序,它会在每天的午夜时分割日志文件。when 参数可以指定分割的时间点,backupCount 参数可以指定保留的日志文件个数。在使用 TimedRotatingFileHandler 类型的日志处理器对象时,会根据指定的时间间隔创建新的日志文件,并在文件名中添加时间戳后缀。

    具体来说,当日志文件发生轮换时,会在原来的日志文件名后面添加一个时间戳后缀,例如:

      原始日志文件名为 app.log,当轮换发生时,会将其备份为 app.log.2023-04-20,其中 2023-04-20 为轮换时的日期。

      下次轮换发生时,会将原始日志文件名为 app.log 的文件备份为 app.log.2023-04-21,同时将 app.log.2023-04-20 删除,以保持日志文件的数量在备份数量之内。

    因此,使用 TimedRotatingFileHandler 类型的日志处理器对象时,每个日志文件名中都会包含时间戳后缀,以便区分不同的日志文件。

    日志缓冲

    在使用 logging 模块记录日志时,默认情况下,每条日志信息都会立即写入到磁盘文件中。这样会频繁地访问磁盘,导致程序性能下降。

    为了避免频繁访问磁盘,logging 模块提供了缓冲机制。当使用缓冲机制时,多条日志信息会先存储在内存中,直到满足一定条件后再将它们写入磁盘文件。通过这种方式可以减少频繁访问磁盘的次数,提高程序的性能和效率。

    在 logging 模块中,可以使用

    logging.handlers
    模块中的
    BufferingHandler
    类来实现日志缓冲机制。
    BufferingHandler
    类中的
    bufferSize
    参数指定了缓冲区的大小。当日志信息达到缓冲区的容量时,就会将缓冲区中的信息写入磁盘文件。

    下面是一个使用日志缓冲机制的例子:

    import logging
    from logging.handlers import BufferingHandler
    
    # 配置 logging
    logging.basicConfig(level=logging.DEBUG)
    
    # 创建 logger 对象
    logger = logging.getLogger()
    
    # 创建带缓冲的文件处理程序
    handler = BufferingHandler(capacity=5)
    
    # 将处理程序添加到 logger 对象
    logger.addHandler(handler)
    
    # 记录信息
    for i in range(10):
        logger.debug('这是第 %s 条调试信息', i+1)

    在上面的例子中,我们使用

    BufferingHandler
    类型的日志处理器对象创建了一个带缓冲的文件处理程序,并设置缓冲区的容量为
    5
    。然后使用 logger 对象记录了
    10
    条日志信息。

    由于缓冲区容量为

    5
    ,当记录了
    5
    条日志信息后,就会将它们一起写入磁盘文件。因此,第
    1
    条到第
    5
    条日志信息会被存储在内存缓冲区中,而第
    6
    条到第
    10
    条日志信息会被存储在内存缓冲区中,并在最后一次写入时一起写入到磁盘文件中。

    通过这种方式,我们可以减少频繁访问磁盘的次数,提高程序的性能和效率。需要注意的是,设置过大的缓冲区容量可能会占用过多的内存,从而导致程序崩溃。因此,需要根据实际需求和系统资源进行权衡和设置。

    标签: python

    热门推荐