Python log模块logging记录打印用法解析

logging模块简介

在Python中,logging模块是一种灵活的方式来记录程序运行时的信息,它允许输出不同级别的日志信息到不同的地方,如控制台、文件、电子邮件等。通过logging模块,可以为不同的模块和应用程序设置不同的日志级别。同时,logging模块还提供了一些有用的过滤器和处理器来处理日志信息。

使用logging模块记录程序日志

为了使用logging模块记录程序日志,我们首先需要在程序中导入logging模块。

import logging

然后,我们需要设置logging模块的基本配置。可以通过以下代码设置:

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

其中,level用于设置日志的级别,可选项有:

CRITICAL

ERROR

WARNING

INFO

DEBUG

NOTSET

这些级别按严重程度逐渐降低。默认情况下,日志级别为WARNING,logging模块不会记录比该级别低的日志信息。

format用于设置输出的日志信息的格式。在上述代码中,日志信息的格式为:

timestamp - logger_name - log_level - log_message

其中,timestamp是记录日志的时间,logger_name是记录日志的模块名,log_level是记录日志的级别,log_message是记录日志的信息。

设置好logging模块的基本配置后,我们就可以使用logging模块来记录日志信息了。比如我们可以使用以下代码记录一条DEBUG级别的日志信息:

logging.debug('This is a debug message')

当日志级别为DEBUG时,该日志信息会被记录并输出到控制台。

除了输出到控制台,我们还可以使用文件来记录日志信息。可以通过以下代码来设置输出日志信息到文件:

logging.basicConfig(filename='app.log', filemode='w', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

logging.warning('This is a warning message')

其中,filename用于设置日志输出到的文件名,filemode用于设置以写入模式(w)打开文件。

使用logging模块的高级功能

1. 日志信息格式化

我们可以使用logging模块的Format类来自定义日志信息的格式。Format类有以下属性:

%(asctime)s:日志时间

%(name)s:日志器名称

%(levelname)s:日志等级名称

%(message)s:日志信息

我们可以根据自己的需要来设置日志信息格式。例如,如果想要在日志信息中加入行号和函数调用信息,可以使用以下代码:

logging.basicConfig(format='%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')

2. 记录日志信息到多个输出

logging模块支持将日志信息记录到多个输出,例如控制台和文件。可以使用如下代码进行设置:

logger = logging.getLogger('my_logger')

logger.setLevel(logging.DEBUG)

fh = logging.FileHandler('my.log')

fh.setLevel(logging.WARNING)

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setFormatter(formatter)

ch.setFormatter(formatter)

logger.addHandler(fh)

logger.addHandler(ch)

logger.debug('This is a debug message')

logger.info('This is an information message')

logger.warning('This is a warning message')

logger.error('This is an error message')

logger.critical('This is a critical message')

在上述代码中,我们定义了一个名为my_logger的日志器,设置其日志级别为DEBUG,定义了一个输出到文件的处理器fh,并将其日志级别设置为WARNING,定义了一个输出到控制台的处理器ch,并将其日志级别设置为DEBUG。然后,我们设置了输出日志信息的格式,并将处理器fh和ch添加到my_logger中。最后,我们使用my_logger来记录日志信息并输出到控制台和文件。

3. 使用日志过滤器

logging模块支持使用过滤器来过滤日志信息,以便只记录满足特定条件的日志信息。例如,我们可以使用以下代码来设置一个过滤器,只记录包含特定字符串的日志信息:

class MyFilter(logging.Filter):

def __init__(self, name):

super(MyFilter, self).__init__(name)

self.name = name

def filter(self, record):

return 'special_message' in record.getMessage()

logger = logging.getLogger('my_logger')

logger.setLevel(logging.DEBUG)

fh = logging.FileHandler('my.log')

fh.setLevel(logging.WARNING)

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

fh.setFormatter(formatter)

ch.setFormatter(formatter)

logger.addHandler(fh)

logger.addHandler(ch)

my_filter = MyFilter('special_message')

fh.addFilter(my_filter)

logger.debug('This is a debug message')

logger.info('This is an information message')

logger.warning('This is a warning message')

logger.error('This is a special_message error message')

logger.critical('This is a critical message')

在上述代码中,我们定义了一个名为MyFilter的过滤器,该过滤器只记录包含“special_message”的日志信息。然后,我们将MyFilter添加到文件处理器fh中,并将fh添加到my_logger中。最后,我们使用my_logger来记录日志信息。由于只有一条日志信息包含“special_message”,因此只有这条日志信息会被记录。

4. 使用异常信息记录日志

我们可以使用logging模块来记录异常信息。例如,我们可以在try-except语句中通过以下方式记录异常信息:

try:

a = 10 / 0

except Exception as e:

logging.error('Exception occurred', exc_info=True)

在上述代码中,我们捕获了一个除以零的异常,并在异常处理块中记录了异常信息。当我们设置exc_info=True时,logging模块会自动将异常信息记录到日志中。

总结

logging模块提供了一种方便而灵活的记录程序日志信息的方式。通过logging模块,我们可以记录不同级别的日志信息到不同的输出端口,使用自定义的格式记录信息,过滤满足特定条件的日志信息。同时,logging模块还可以记录异常信息,方便程序员调试程序。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签