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模块还可以记录异常信息,方便程序员调试程序。