Python中logging模块

1. 概述

Python的logging模块提供了一个灵活的记录日志的工具。日志是开发者跟踪和检查程序的关键工具之一,有时,日志比调试器更为重要,尤其是当程序在生产环境运行时。在这篇文章中,我们将介绍logging模块,它的特性以及如何将它集成到你的Python代码中,以方便跟踪程序的运行时状态。

2. 基础知识

2.1 日志的级别

在logging模块中,有5种不同级别的日志:

DEBUG:详细的信息,通常用于调试目的。

INFO:确认一切按预期运行。

WARNING:表示警告,但程序仍然正常运行。

ERROR:由于更严重的问题,程序已不能执行某些功能。

CRITICAL:严重错误,表明程序可能无法继续运行。

logging模块中提供的日志级别的优先级从低到高为DEBUGINFOWARNINGERRORCRITICAL。也就是说,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及级别更高的日志将会被记录。然后,我们使用了FileHandlerStreamHandler处理器,他们将日志输出到文件和控制台上。我们使用了setFormatter()方法为日志记录指定了一种格式。最后,我们通过记录器的5个log方法(debuginfowarningerrorcritical)分别写入了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中非常常用的一个模块,它能够帮助我们跟踪程序的运行状态,在程序出错时提供有用的信息。我们需要根据实际需求,设计合适的日志记录方案,这将为我们的程序开发与调试提供巨大的帮助。

后端开发标签