Python的logging模块是一个用于记录日志信息的标准模块。它提供了一种灵活的方式来记录错误信息、调试信息和其他有用的日志数据。
1 简单使用logging记录日志
logging是Python的标准库之一,无需额外安装。您可以直接在Python代码中使用logging模块来记录日志。
这里日志默认是打印到控制台中的。
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('这是一个调试信息')
logging.info('这是一个一般信息')
logging.warning('这是一个警告信息')
logging.error('这是一个错误信息')
logging.critical('这是一个严重错误信息')
2 实现自定义logger
自定义logger有以下几个步骤
- 创建一个logger
- 创建一个handler
- 定义handler的输出格式
- 给logger添加handler,可以添加多个,例如再额外建立一个控制台的handler,就可以同时输出日志到控制台和日志文件中
- 使用自定义logger
import logging
# 1.创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 2.创建一个handler,用于写入日志文件
fh = logging.FileHandler('my_log.log')
# 3.定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# 4.给logger添加handler
logger.addHandler(fh)
# 5.使用自定义logger记录日志
logger.info('这是一条info级别的日志。')
logger.debug('这是一条debug级别的日志。')
在这个例子中,我们使用了以下日志格式:
- %(asctime)s:记录日志的时间,格式为2023-07-07 10:15:30,123(包含时间戳和微秒)。
- %(name)s:记录logger的名称。
- %(levelname)s:记录日志级别(如DEBUG,INFO等)。
- %(message)s:记录日志消息。
你可以根据自己的需要调整这个格式。例如,如果你想要移除时间戳,可以将格式改为’%(name)s - %(levelname)s - %(message)s’。
3 根据日志文件大小分割日志
import logging
from logging.handlers import RotatingFileHandler
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建一个RotatingFileHandler实例,设置日志文件名和最大大小
handler = RotatingFileHandler('my_log.log', maxBytes=1024*1024, backupCount=5) # 1MB, 5 files
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(handler)
# 记录一条日志,这将触发日志文件的创建和分割
logger.info('这是一条info级别的日志。')
在这个例子中,日志文件my_log.log的最大大小被设置为1MB。当日志文件达到这个大小时,它将自动创建一个新的日志文件,并继续写入。已创建的日志文件将按照时间顺序命名,例如my_log.log.1,my_log.log.2等。最多保留5个备份文件。
4.根据日期对日志文件进行分割
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建一个logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建一个TimedRotatingFileHandler实例,设置日志文件名和时间间隔
handler = TimedRotatingFileHandler('my_log.log', when='midnight') # midnight表示每天午夜进行一次日志切割
# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(handler)
# 记录一条日志,这将触发日志文件的创建和分割
logger.info('这是一条info级别的日志。')
5 使用logging模块进行日志记录时,需要注意以下几点:
- 日志级别设置:logging模块提供了多种日志级别,如DEBUG、INFO、WARNING、ERROR和CRITICAL等。在设置日志级别时,应该考虑所记录的信息量和日志文件大小。通常,DEBUG级别的日志包含大量信息,可能会导致日志文件过大。而CRITICAL级别的日志则可能包含较少的信息。因此,需要根据实际需求选择适当的日志级别。
- 日志文件名重复覆盖问题:如果创建的日志文件名与已有的文件名重复,会导致历史文件被覆盖。因此,在命名日志文件时,应该考虑如何避免这种情况的发生。一种方法是使用时间戳等唯一标识符作为文件名的后缀,另一种方法是使用RotatingFileHandler来自动分割日志文件。
- 日志格式设置:logging模块允许自定义日志格式,包括时间戳、日志级别、日志消息等。可以根据需要设置适当的日志格式,以便更好地管理和查看日志文件。
- 日志记录器(logger)与处理程序(handler)的关系:logger是用来记录日志的对象,handler则是用来处理日志的对象。一个logger可以拥有多个handler,每个handler可以设置不同的日志级别和输出目标。在设置handler时,应该考虑如何将不同类型的日志消息发送到不同的输出目标,以便更好地管理和查看不同类型的日志。
- 日志模块与其他模块的集成:logging模块可以与其他Python模块集成,如MySQL、Redis等。在使用logging模块记录这些模块的日志时,应该了解如何正确地设置和使用这些模块的日志级别和输出目标,以便更好地管理和查看这些模块的日志。