Python 记录日志的灵活性和可配置性介绍
Python 的 logging 模块是官方提供的日志记录模块,可以帮助我们快速方便地记录代码中的各种事件。它提供了很多种不同的日志记录方式,可以非常灵活地配置,满足不同应用场景的要求。
基本用法
使用 logging 模块非常简单,我们只需要导入模块,然后创建一个 logger 对象即可。使用 logger 对象可以调用不同的方法记录日志。以下是一个基本的示例:
import logging
# 创建 logger 对象
logger = logging.getLogger()
# 设置日志等级
logger.setLevel(logging.DEBUG)
# 创建 FileHandler 对象,用于输出到文件
fh = logging.FileHandler('mylog.log', encoding='utf-8')
# 创建 StreamHandler 对象,用于输出到控制台
ch = logging.StreamHandler()
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 将 handler 对象添加到 logger 中
logger.addHandler(fh)
logger.addHandler(ch)
# 记录日志
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
在这个示例中,我们首先创建了一个 logger 对象,然后设置了日志等级为 DEBUG,这样可以记录所有级别的日志。接着分别创建了一个 FileHandler 对象和一个 StreamHandler 对象,分别用于输出到文件和控制台。我们还为 handler 对象设置了格式化器,这样日志输出时可以按照我们规定的格式进行。最后,我们使用 logger 对象记录了不同等级的日志,这些日志会按照不同的方式输出,如下所示:
- debug 和 info 级别的日志会同时输出到文件和控制台;
- warning、error 和 critical 级别的日志会仅输出到文件。
日志等级
logging 模块提供了以下 5 种日志等级:
- DEBUG:最详细的日志信息,通常只在调试时才使用。
- INFO:确认一切按预期运行。
- WARNING:程序出现潜在错误或异常情况。
- ERROR:由于更严重的问题,程序不能执行一些功能了。
- CRITICAL:严重错误,程序可能崩溃。
我们可以使用如下的方式设置日志等级:
logger.setLevel(logging.DEBUG)
日志格式
logging 模块支持自定义格式化字符串,格式化字符串中包含若干个字段,每个字段都有特定的含义,例如:
- %(asctime)s:日志记录时间
- %(levelname)s:日志等级名称
- %(name)s:logger 对象名称
- %(message)s:日志信息内容
我们可以使用如下的方式创建格式化器:
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
输出到文件
如果我们希望将日志记录到文件中,可以使用 FileHandler 对象。以下是示例:
# 创建 FileHandler 对象,用于输出到文件
fh = logging.FileHandler('mylog.log', encoding='utf-8')
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# 将 handler 对象添加到 logger 中
logger.addHandler(fh)
# 记录日志
logger.debug('debug message')
在这个示例中,我们首先创建了一个 FileHandler 对象,指定了日志文件名称以及编码方式。然后,我们将格式化器添加到 FileHandler 对象中,并将 FileHandler 对象添加到 logger 对象中,接着调用 logger 对象记录日志即可。
输出到控制台
如果我们希望将日志记录输出到控制台,可以使用 StreamHandler 对象。以下是示例:
# 创建 StreamHandler 对象,用于输出到控制台
ch = logging.StreamHandler()
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
# 将 handler 对象添加到 logger 中
logger.addHandler(ch)
# 记录日志
logger.debug('debug message')
在这个示例中,我们首先创建了一个 StreamHandler 对象,然后将格式化器添加到 StreamHandler 对象中,并将 StreamHandler 对象添加到 logger 对象中,接着调用 logger 对象记录日志即可。
总结
Python 的 logging 模块非常灵活和可配置,通过控制不同的 handler 对象和日志等级,我们可以满足不同场景下的日志记录需求。同时,自定义格式化字符串也能让日志输出更加规范化和易读。
这里给出两个实例:
实例1
我们希望将日志记录到不同的文件中,debug 日志记录到 debug.log 文件中,error 和 critical 记录到 error.log 文件中。代码如下:
# 创建 logger 对象
logger = logging.getLogger()
# 设置日志等级
logger.setLevel(logging.DEBUG)
# 创建 FileHandler 对象,用于输出到文件
fh_debug = logging.FileHandler('debug.log', encoding='utf-8')
fh_error = logging.FileHandler('error.log', encoding='utf-8')
# 设置日志等级
fh_debug.setLevel(logging.DEBUG)
fh_error.setLevel(logging.ERROR)
# 设置格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh_debug.setFormatter(formatter)
fh_error.setFormatter(formatter)
# 将 handler 对象添加到 logger 中
logger.addHandler(fh_debug)
logger.addHandler(fh_error)
# 记录日志
logger.debug('debug message')
logger.error('error message')
在这个示例中,我们定义了两个 FileHandler 对象,分别用于输出到不同的文件中。我们还分别设置了不同的日志等级和格式化器,保证每个文件中的日志都具有相同的输出格式。最后我们使用 logger 对象记录了两条不同等级的日志。
实例2
我们希望将日志记录到 Django 中,以便通过 Django 的管理界面进行查看,代码如下:
# 在项目的 settings.py 文件中添加如下配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'django': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'django.log',
'formatter': 'verbose'
},
},
'loggers': {
'django': {
'handlers': ['django'],
'level': 'DEBUG',
},
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
},
}
# 在代码中使用
import logging
logger = logging.getLogger('django')
logger.debug('debug message')
在这个示例中,我们在项目的 settings.py 文件中添加了如上 logging 的配置,指定将日志输出到文件 django.log 中,并使用 verbose 格式化输出。然后在代码中调用 logger 对象即可将日志记录到 Django 中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 记录日志的灵活性和可配置性介绍 - Python技术站