目录
简介
logging
模块是 Python 标准库中用于记录日志的强大工具。它可以帮助开发者记录程序运行时的信息,包括调试信息、警告、错误等,从而便于排查问题和监控程序运行状态。
为什么使用 logging
?
相比于直接使用 print()
打印信息,logging
提供了以下优势:
- 分级管理 :可以根据日志的严重程度(如 DEBUG、INFO、WARNING、ERROR、CRITICAL)灵活控制输出。
- 多输出目标 :可以将日志输出到控制台、文件、网络等多种目标。
- 格式化输出 :支持自定义日志格式,包含时间戳、日志级别、模块名等信息。
- 性能优化 :支持延迟记录日志(如仅在特定条件下记录),避免不必要的性能开销。
日志级别
logging
模块提供了以下几种日志级别(从低到高):
- DEBUG :调试信息,通常用于开发阶段。
- INFO :程序正常运行时的信息。
- WARNING :潜在的问题,但不会影响程序运行。
- ERROR :程序运行出错,某些功能无法正常工作。
- CRITICAL :严重错误,可能导致程序崩溃。
默认的日志级别是 WARNING ,即只有等于或高于 WARNING 级别的日志会被记录。
基本用法
1.简单示例
import logging
# 配置日志的基本设置
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# 记录不同级别的日志
logging.debug("这是一个调试信息")
logging.info("这是一个普通信息")
logging.warning("这是一个警告信息")
logging.error("这是一个错误信息")
logging.critical("这是一个严重错误信息")
输出示例:
2023-03-01 12:00:00,123 - DEBUG - 这是一个调试信息
2023-03-01 12:00:00,123 - INFO - 这是一个普通信息
2023-03-01 12:00:00,123 - WARNING - 这是一个警告信息
2023-03-01 12:00:00,123 - ERROR - 这是一个错误信息
2023-03-01 12:00:00,123 - CRITICAL - 这是一个严重错误信息
2. 将日志写入文件
通过 basicConfig
的 filename
参数,可以将日志输出到文件
import logging
# 配置日志输出到文件
logging.basicConfig(filename='app.log', level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug("这是一个调试信息")
logging.info("这是一个普通信息")
logging.warning("这是一个警告信息")
运行后会在当前目录生成一个 app.log
文件,内容如下:
2023-03-01 12:00:00,123 - DEBUG - 这是一个调试信息
2023-03-01 12:00:00,123 - INFO - 这是一个普通信息
2023-03-01 12:00:00,123 - WARNING - 这是一个警告信息
高级用法
1. 创建 Logger 对象
basicConfig
是一种简单的配置方式,但更灵活的方式是使用 Logger
对象:
import logging
# 创建 Logger 对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG) # 设置日志级别
# 创建 Handler,用于输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建 Formatter,定义日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
# 将 Handler 添加到 Logger
logger.addHandler(console_handler)
# 记录日志
logger.debug("这是一个调试信息")
logger.info("这是一个普通信息")
logger.warning("这是一个警告信息")
logger.error("这是一个错误信息")
logger.critical("这是一个严重错误信息")
2. 同时输出到控制台和文件
可以通过添加多个 Handler
实现日志同时输出到控制台和文件:
import logging
# 创建 Logger 对象
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# 创建 Handler,用于输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建 Handler,用于输出到文件
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.ERROR) # 仅记录 ERROR 及以上级别的日志
# 创建 Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加 Handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志
logger.debug("这是一个调试信息") # 仅输出到控制台
logger.error("这是一个错误信息") # 输出到控制台和文件
3. 捕获异常信息
logging
支持捕获异常并记录堆栈信息:
import logging
logging.basicConfig(level=logging.DEBUG)
try:
1 / 0
except Exception as e:
logging.error("发生了一个错误", exc_info=True)
输出示例:
ERROR:root:发生了一个错误
Traceback (most recent call last):
File "example.py", line 6, in <module>
1 / 0
ZeroDivisionError: division by zero
日志格式化参数
Formatter
支持多种占位符,常用的有:
%(asctime)s
:日志记录的时间。%(name)s
:Logger 的名称。%(levelname)s
:日志级别。%(message)s
:日志消息。%(filename)s
:调用日志记录的文件名。%(lineno)d
:调用日志记录的代码行号。%(funcName)s
:调用日志记录的函数名。
总结
logging
模块是 Python 中非常强大的日志工具,适合各种规模的应用程序。通过合理配置日志级别、输出目标和格式,可以有效提升程序的可维护性和可观测性。