Python标准库中的logging用法示例详解

1. 简介

logging是Python官方提供的标准库,它提供了一个灵活而不失强大的日志记录系统,是Python开发中必不可少的一部分。它支持多种输出方式,包括控制台输出、文件输出等等,同时也支持自定义日志级别、格式、过滤器。

2. logging的基本用法

2.1 简单的输出

首先,我们先来看看最简单的使用方法:

import logging

logging.basicConfig(level=logging.INFO)

logging.info('Hello World!')

这段代码输出的结果为:

INFO:root:Hello World!

其中,basicConfig方法是用来配置logging的一些最基本的属性,比如指定输出的级别,格式等等。在这里,我们将输出级别设置为INFO。然后,我们使用logging模块提供的一系列方法来输出日志,比如这里的info方法。最后,我们得到了一条带有INFO级别的日志信息,其中INFO为默认输出的日志级别,代表信息级别。

2.2 输出到文件

在实际开发中,我们通常不会仅仅只是把日志输出到控制台,而是需要将日志保存到日志文件中。这时,我们可以使用FileHandler来实现这种功能。接下来,让我们来看一下FileHandler的基本用法。

import logging

logger = logging.getLogger()

handler = logging.FileHandler('log.txt', encoding='UTF-8')

handler.setLevel(logging.INFO)

formatter = logging.Formatter('[%(asctime)s]%(filename)s(%(lineno)d):\n%(message)s')

handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info('Hello World!')

首先,我们通过getLogger方法获取到了logger对象。此处没有传递任何参数,表示使用默认的logger实例。接着,我们创建了一个FileHandler对象,指定输出的文件名以及文件编码方式。在这里,我们将输出级别设置为INFO。然后,我们创建了一个Formatter对象,用于指定输出的格式。最后,我们将创建好的Handler和Formatter添加到logger对象中,这样就完成了输出到文件的设置。

2.3 输出到不同的Handler

在正式的开发中,有时候我们既需要将日志输出到控制台,同时也需要将日志输出到文件中,这种情况下,我们需要使用到logging模块提供的多Handler机制。接下来,让我们来看一下同时输出到文件和控制台的用法示例:

import logging

console_handler = logging.StreamHandler()

console_handler.setLevel(logging.INFO)

file_handler = logging.FileHandler('log.txt', mode='a', encoding='UTF-8')

file_handler.setLevel(logging.DEBUG)

formatter = logging.Formatter('[%(asctime)s]%(filename)s(%(lineno)d):\n%(message)s')

console_handler.setFormatter(formatter)

file_handler.setFormatter(formatter)

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

logger.addHandler(console_handler)

logger.addHandler(file_handler)

logger.debug('debug message')

logger.info('info message')

logger.warning('warning message')

logger.error('error message')

logger.critical('critical message')

首先,我们分别指定了输出到控制台和输出到文件中的Handler。在这里,我们的输出级别分别是INFO和DEBUG,分别指定在控制台和文件中只输出这个级别及以上的日志记录。然后,我们将两个Handler各自的Formatter设置好,最后将其添加到logger实例中。

在代码的最后,我们使用logger来记录不同级别的日志,这时的输出记录将会同时被输出到控制台和文件中。这里我们分别使用了debug、info、warning、error、critical这五种不同的级别来输出日志,每条日志信息中都会包含时间、文件名、代码行号、日志信息等信息。

3. 自定义日志级别

除了默认的五个日志级别外,我们还可以自定义其他的日志级别。下面我们来看一下如何使用logging模块来实现自定义日志级别的功能:

import logging

CUSTOM_LEVEL = 15

logging.addLevelName(CUSTOM_LEVEL, 'CUSTOM')

def custom(self, message, *args, **kwargs):

if self.isEnabledFor(CUSTOM_LEVEL):

self._log(CUSTOM_LEVEL, message, args, **kwargs)

logging.Logger.custom = custom

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

logger.addHandler(logging.StreamHandler())

logger.custom('custom message')

首先,我们通过addLevelName方法来添加了一个名为CUSTOM、值为15的自定义日志级别。然后,我们使用logger对象提供的_log方法来输出日志信息。

最后,我们通过logger添加了一个输出到控制台的Handler,并使用custom方法输出了一条自定义级别的日志信息。在这里,我们自定义的日志级别为15,仅当日志级别为15及以上时才会输出在控制台中。

4. 使用过滤器

由于在实际应用中,我们可能遇到输出大量日志的情况,而这些日志中有些我们不想输出。此时可以使用logging模块提供的过滤器功能,来快速地过滤掉不需要的日志信息。接下来,我们来看一下过滤器的正确用法:

import logging

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()

handler.setLevel(logging.DEBUG)

class InfoFilter(logging.Filter):

def filter(self, record):

if record.levelname == 'INFO':

return False

return True

filter = InfoFilter()

handler.addFilter(filter)

formatter = logging.Formatter('[%(asctime)s][%(filename)s][%(levelname)s]:%(message)s')

handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info('info message')

logger.debug('debug message')

首先,我们使用Filter来创建了一个记录器过滤器,这里会过滤掉所有的INFO级别日志。然后,我们将这个过滤器添加到handler中,这样所有在此handler下的日志输出都会受到这个过滤器的影响。最后,我们输出了一条INFO级别日志和一条DEBUG级别日志。

输出结果只包含了一条DEBUG级别的日志:

[2021-11-02 10:33:46,285][logging_demo.py][DEBUG]:debug message

5. 总结

本文简单介绍了logging模块的基本用法,包括简单的输出、输出到文件、输出到不同的Handler以及自定义日志级别和使用过滤器等内容。logging模块的功能强大,可以帮助我们在开发中快速实现日志输出的需求。相信读完本文后,您也对Python中的logging模块有了更深的理解。

后端开发标签