1. 概述
Python的logging
模块提供了一个灵活的记录日志的工具。日志是开发者跟踪和检查程序的关键工具之一,有时,日志比调试器更为重要,尤其是当程序在生产环境运行时。在这篇文章中,我们将介绍logging模块,它的特性以及如何将它集成到你的Python代码中,以方便跟踪程序的运行时状态。
2. 基础知识
2.1 日志的级别
在logging模块中,有5种不同级别的日志:
DEBUG
:详细的信息,通常用于调试目的。
INFO
:确认一切按预期运行。
WARNING
:表示警告,但程序仍然正常运行。
ERROR
:由于更严重的问题,程序已不能执行某些功能。
CRITICAL
:严重错误,表明程序可能无法继续运行。
logging模块中提供的日志级别的优先级从低到高为DEBUG
,INFO
,WARNING
,ERROR
,CRITICAL
。也就是说,DEBUG
级别的日志将会被所有的日志记录器记录,而CRITICAL
级别的日志只会被优先级别比它高的日志中记录器记录。
2.2 日志记录器
在logging模块中,我们可以通过创建一个Logger对象,来处理所有的日志记录。该Logger对象根据用户提供的name
构建,这个name
代表了该Logger对象的唯一标识符。当使用这个Logger对象记录日志文件时,可以通过给记录器的处理器(Handler)设置日志级别,来过滤掉并不重要的日志信息。
Logger对象的主要方法:
debug(msg, *args, **kwargs)
:产生一条DEBUG
级别的日志信息。
info(msg, *args, **kwargs)
:产生一条INFO
级别的日志信息。
warning(msg, *args, **kwargs)
:产生一条WARNING
级别的日志信息。
error(msg, *args, **kwargs)
:产生一条ERROR
级别的日志信息。
critical(msg, *args, **kwargs)
:产生一条CRITICAL
级别的日志信息。
2.3 日志处理器
在logging模块中,日志处理器也是非常重要的。处理器将日志传到各种设备或输出流中,例如文件、标准输出、网络中等。Python提供了许多不同类型的处理器,你可以按需选用。
常用的处理器有:
StreamHandler
:用于将日志输出至控制台。
FileHandler
:将日志输出至磁盘文件。
RotatingFileHandler
:可按照日志大小或时间进行分割,自动得到多个日志文件。
SocketHandler
:用于将日志发送至网络服务器。
3. 使用范例
下面我们将使用一个简单的例子来说明如何使用logging模块。首先,我们需要创建logger对象,然后添加处理器。
import logging
# 创建logger对象
logger = logging.getLogger('example_logger')
logger.setLevel(logging.INFO)
# 创建日志文件处理器
fh = logging.FileHandler('example.log')
fh.setLevel(logging.DEBUG)
# 创建流处理器
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
# 格式化日志记录
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
# 将处理器添加到记录器
logger.addHandler(fh)
logger.addHandler(sh)
# 记录日志
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
在上述代码中,我们设置了一个记录器,example_logger
,并设置其级别为INFO
,这意味着INFO
及级别更高的日志将会被记录。然后,我们使用了FileHandler
和StreamHandler
处理器,他们将日志输出到文件和控制台上。我们使用了setFormatter()
方法为日志记录指定了一种格式。最后,我们通过记录器的5个log
方法(debug
,info
,warning
,error
,critical
)分别写入了5种级别的日志信息。
4. 实际应用
在实际应用中,logging模块是非常常用的。下面我们将以一个具体的例子来介绍如何在Python程序中调用logging模块。
4.1 例子分析
假设我们有一个Python程序,要将获取到的城市天气信息保存在日志文件中。程序获取天气信息的方式是从API接口中获取,并且每次获取的城市是随机的。为了记录程序的运行状态,我们需要将程序运行时的错误信息也写入日志文件中。
4.2 完整代码
以下是一个基于logging模块的Python程序,可以从API接口中获取城市天气信息,并将结果保存在日志文件中。
Step 1:导入相关模块
import random
import logging
import requests
import json
Step 2:配置logging
# 创建Logger对象
logger = logging.getLogger('city_weather')
logger.setLevel(logging.DEBUG)
# 创建FileHandler对象
fh = logging.FileHandler('city_weather.log')
fh.setLevel(logging.DEBUG)
# 日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# 添加Handler
logger.addHandler(fh)
Step 3:获取天气信息
def get_city_weather(city):
"""获取城市天气信息"""
try:
url = f'http://restapi.amap.com/v3/weather/weatherInfo?key=your_key&city={city}&extensions=base'
response = requests.get(url)
result = json.loads(response.text)
return result
except requests.exceptions.RequestException as ex:
# 记录错误信息
logger.error(f'获取[{city}]天气信息失败,异常信息:{ex}')
except Exception as ex:
# 记录错误信息
logger.error(f'获取[{city}]天气信息失败,异常信息:{ex}')
Step 4:主函数
def main(cities):
"""主函数"""
logger.info(f'获取[{len(cities)}]个城市天气信息')
for city in cities:
weather_info = get_city_weather(city)
if weather_info:
logger.info(f'获取[{city}]天气信息成功,结果:{weather_info}')
logger.info('程序运行完成')
Step 5:运行程序
if __name__ == '__main__':
cities = ['北京', '上海', '广州', '深圳', '杭州', '南京', '苏州', '武汉', '成都']
random.shuffle(cities)
main(cities)
5. 总结
通过本文的介绍,我们了解了logging模块的基本概念、日志级别、日志记录器、日志处理器以及实际应用。logging模块是Python中非常常用的一个模块,它能够帮助我们跟踪程序的运行状态,在程序出错时提供有用的信息。我们需要根据实际需求,设计合适的日志记录方案,这将为我们的程序开发与调试提供巨大的帮助。