Python日志记录通过logging模块实现,核心组件包括Logger、Handler、Formatter和Filter。使用basicConfig可快速配置,而复杂场景可通过自定义Logger和Handler将日志输出到控制台、文件或滚动文件。相比print,logging支持级别控制(DEBUG、INFO、WARNING、ERROR、CRITICAL),可灵活配置输出目标与格式,适用于调试、监控和生产环境。通过FileHandler写入文件,RotatingFileHandler按大小滚动,TimedRotatingFileHandler按时间滚动,实现高效日志管理。

Python中的日志记录,核心在于通过
logging
要配置和使用Python的日志记录,你需要理解几个核心组件:
Logger
Handler
Formatter
Filter
最基础的用法,可以直接通过
logging.basicConfig()
import logging
# 配置基本日志,将INFO级别及以上的消息输出到控制台
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('这是一条调试信息') # 不会显示,因为级别低于INFO
logging.info('程序启动了')
logging.warning('检测到潜在问题')
logging.error('发生了一个错误')
logging.critical('系统崩溃!')当你需要更复杂的控制时,比如将日志同时输出到文件和控制台,或者自定义不同的日志级别和格式,就需要手动创建和配置
Logger
Handler
Formatter
立即学习“Python免费学习笔记(深入)”;
import logging
# 1. 获取一个记录器实例
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG) # 设置记录器最低处理级别为DEBUG
# 2. 创建一个文件处理器,用于将日志写入文件
file_handler = logging.FileHandler('app.log', encoding='utf-8')
file_handler.setLevel(logging.INFO) # 文件处理器只处理INFO及以上级别的日志
# 3. 创建一个控制台处理器,用于将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG) # 控制台处理器处理DEBUG及以上级别的日志
# 4. 定义日志的格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 5. 将格式器添加到处理器
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 6. 将处理器添加到记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 现在可以使用logger来记录日志了
logger.debug('这条调试信息会出现在控制台')
logger.info('这条信息会出现在文件和控制台')
logger.warning('这是一个警告,也会出现在两处')
try:
1 / 0
except ZeroDivisionError:
logger.exception('除零错误发生!') # exception会自动记录堆栈信息这段代码展示了如何细致地控制日志流向和内容。
getLogger
Handler
说实话,刚开始写Python脚本时,谁不是满屏的
print()
print()
logging
首先,它提供了日志级别。
DEBUG
INFO
WARNING
ERROR
CRITICAL
DEBUG
INFO
WARNING
print()
其次,输出目标多样化。
print()
logging
Handler
print()
再者,格式化输出。
logging.Formatter
print()
logging
最后,也是我认为最关键的一点,
logging
Python的
logging
DEBUG (10):这是最低的级别,用于详细的调试信息。通常只在开发阶段或需要深入排查问题时启用。比如,某个变量的值在特定代码点是什么,某个函数被调用时传入了什么参数。
logger.debug("处理用户请求,用户ID: %s", user_id)INFO (20):用于确认程序按预期运行的事件。这些是程序正常运行时的“里程碑”信息,可以用来了解程序的整体流程。
logger.info("数据库连接成功")
logger.info("任务调度器启动")WARNING (30):表示发生了意外或将来可能出现问题的情况,但程序仍然能够正常运行。这通常是一些需要注意但不是致命的问题。
logger.warning("配置文件未找到,使用默认设置")
logger.warning("缓存刷新失败,将尝试重试")ERROR (40):由于某个严重的问题,程序无法执行某些功能。这通常意味着某个操作失败了,但整个应用程序可能还没有完全崩溃。
logger.error("文件写入失败:%s", file_path)
logger.error("API调用返回错误状态码:%d", status_code)CRITICAL (50):这是最高的级别,表示发生了非常严重的错误,导致程序本身或系统组件无法继续运行。通常需要立即采取行动。
logger.critical("数据库服务不可用,应用程序即将退出")
logger.critical("内存溢出,系统崩溃!")如何选择合适的级别?
选择日志级别更像是一种艺术,而非严格的科学。我的经验是,从目的出发。
DEBUG
DEBUG
INFO
DEBUG
INFO
WARNING
INFO
WARNING
ERROR
CRITICAL
DEBUG
一个好的实践是,“宁滥勿缺”地记录,但“按需过滤”地输出。也就是说,在代码中,你可以在任何你觉得有用的地方打上
DEBUG
INFO
Handler
将日志输出到文件是日志记录最常见的需求之一,因为它提供了持久化的记录,便于事后分析和故障排查。而“滚动文件”机制则解决了日志文件无限增长的问题,避免占用过多磁盘空间。
1. 输出到单个文件 (FileHandler
最直接的方式是使用
logging.FileHandler
import logging
logger = logging.getLogger('file_logger')
logger.setLevel(logging.DEBUG)
# 创建一个文件处理器,指定日志文件路径和编码
# 默认是'a'模式(追加),如果文件不存在则创建
file_handler = logging.FileHandler('my_application.log', encoding='utf-8')
file_handler.setLevel(logging.INFO) # 文件中只记录INFO及以上级别的日志
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.debug("这条调试信息不会写入文件,因为文件处理器级别是INFO")
logger.info("程序正常运行")
logger.warning("磁盘空间可能不足")
logger.error("致命错误发生")这里需要注意的是,
FileHandler
'a'
mode='w'
FileHandler
2. 输出到滚动文件 (RotatingFileHandler
TimedRotatingFileHandler
当你的应用程序长时间运行,或者产生大量日志时,一个日志文件会变得非常大,这不仅难以管理,也可能耗尽磁盘空间。
RotatingFileHandler
TimedRotatingFileHandler
RotatingFileHandler
这个处理器会在日志文件达到指定大小时,将其重命名(通常是加上
.1
.2
import logging
from logging.handlers import RotatingFileHandler
import time
logger = logging.getLogger('rotating_logger')
logger.setLevel(logging.DEBUG)
# 创建一个滚动文件处理器
# filename: 日志文件名
# maxBytes: 单个日志文件最大字节数,例如 10 * 1024 * 1024 (10MB)
# backupCount: 保留的旧日志文件数量
rotating_handler = RotatingFileHandler(
'app_rotated.log', maxBytes=10 * 1024 * 1024, backupCount=5, encoding='utf-8'
)
rotating_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
rotating_handler.setFormatter(formatter)
logger.addHandler(rotating_handler)
for i in range(1000): # 模拟写入大量日志
logger.info(f"这是第 {i} 条日志消息,程序正在正常运行。")
time.sleep(0.01) # 稍微暂停,以便观察文件滚动当
app_rotated.log
app_rotated.log.1
app_rotated.log
app_rotated.log
app_rotated.log.1
app_rotated.log.2
app_rotated.log
app_rotated.log.1
app_rotated.log
backupCount
TimedRotatingFileHandler
如果你更希望日志文件按天、按小时或按分钟滚动,
TimedRotatingFileHandler
import logging
from logging.handlers import TimedRotatingFileHandler
import time
logger = logging.getLogger('timed_rotating_logger')
logger.setLevel(logging.DEBUG)
# 创建一个按时间滚动的处理器
# filename: 日志文件名
# when: 滚动周期,例如 'h' (小时), 'd' (天), 'midnight' (每天午夜)
# interval: 滚动间隔,例如 when='h', interval=1表示每小时滚动一次
# backupCount: 保留的旧日志文件数量
timed_rotating_handler = TimedRotatingFileHandler(
'app_timed.log', when='midnight', interval=1, backupCount=7, encoding='utf-8'
)
timed_rotating_handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
timed_rotating_handler.setFormatter(formatter)
logger.addHandler(timed_rotating_handler)
# 模拟日志写入
for i in range(50):
logger.info(f"这是第 {i} 条定时滚动日志消息。")
time.sleep(0.5)when
's'
'm'
'h'
'd'
'w0'
'w6'
'midnight'
使用滚动文件处理器是生产环境中日志管理的标准做法。它既保证了日志的完整性,又有效地控制了磁盘使用,是应用程序稳定运行不可或缺的一部分。
以上就是Python 中的日志记录(Logging)如何配置和使用?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号