Python logging 模块:初学者到大师的进阶指南
初学者指南
设置日志记录器
logging 模块提供了一个方便的 API,用于设置日志记录器。日志记录器将负责处理日志消息并将其写入文件或控制台:
import logging
# 创建一个名为 "my_logger" 的日志记录器
logger = logging.getLogger("my_logger")
# 设置日志级别为 DEBUG,表示要记录所有级别的日志消息
logger.setLevel(logging.DEBUG)
记录日志消息
要记录日志消息,请使用日志记录器提供的 debug()
, info()
, warning()
, error()
或 critical()
方法。每个方法对应一个不同的日志级别:
logger.debug("这是 debug 消息")
logger.info("这是 info 消息")
logger.warning("这是 warning 消息")
logger.error("这是 error 消息")
logger.critical("这是 critical 消息")
日志格式
默认情况下,logging 模块使用简单的日志格式,包括日志级别、时间戳和消息。您可以自定义日志格式以包含其他信息,例如函数名称、行号或进程 ID:
# 使用 %(asctime)s、%(levelname)s 和 %(message)s 占位符自定义日志格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
# 将格式器添加到日志记录器
logger.addHandler(logging.StreamHandler())
logger.addHandler(logging.FileHandler("my_log.log"))
中级指南
日志层次结构和传播器
logging 模块支持日志层次结构,其中日志记录器可以具有父级和子级。父级记录器将记录子级记录器中的所有消息:
# 创建一个名为 "parent_logger" 的父级日志记录器
parent_logger = logging.getLogger("parent_logger")
# 创建一个名为 "child_logger" 的子级日志记录器
child_logger = logging.getLogger("parent_logger.child_logger")
# 设置子级日志记录器的日志级别为 INFO,表示仅记录 info 和更高级别的消息
child_logger.setLevel(logging.INFO)
# 父级日志记录器中的消息将传播到子级日志记录器
parent_logger.info("父级日志记录器消息")
child_logger.info("子级日志记录器消息")
日志过滤器
您可以使用日志过滤器来控制哪些日志消息被记录或传播。过滤器可以基于日志级别、消息内容或其他属性:
# 创建一个过滤器,仅允许记录 error 级别及以上的消息
filter = logging.Filter()
filter.filter = lambda record: record.levelno >= logging.ERROR
# 将过滤器添加到日志记录器
logger.addFilter(filter)
高级指南
日志轮转
当日志文件变得过大时,日志轮转可以自动管理和分割日志文件。您可以设置最大日志文件大小或保留一定数量的日志文件:
# 使用 RotatingFileHandler 设置日志轮转,最大日志文件大小为 10MB
handler = logging.handlers.RotatingFileHandler("my_log.log", maxBytes=10240000)
# 将处理程序添加到日志记录器
logger.addHandler(handler)
自定义日志句柄
logging 模块允许您创建自己的日志句柄,提供更大的灵活性。您可以使用 SocketHandler
将日志消息发送到远程服务器,或使用 TimedRotatingFileHandler
根据时间间隔而不是文件大小轮转日志文件:
# 创建一个自定义日志句柄,将日志消息发送到远程服务器
handler = logging.handlers.SocketHandler("localhost", 1234)
# 将处理程序添加到日志记录器
logger.addHandler(handler)
结论
Python logging 模块是一个功能强大且灵活的工具,可以显着提高您程序的日志记录和调试能力。通过了解和使用本指南中介绍的技术,您将能够有效地管理日志、解决问题并确保您的程序稳定可靠地运行。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341