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 模块支持日志层次结构,其中日志记录器可以具有父级和子级。父级记录器将记录子级记录器中的所有消息:
立即学习“Python免费学习笔记(深入)”;
# 创建一个名为 "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 设置日志轮转,最大日志文件大小为 10MBhandler = 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 模块是一个功能强大且灵活的工具,可以显着提高您程序的日志记录和调试能力。通过了解和使用本指南中介绍的技术,您将能够有效地管理日志、解决问题并确保您的程序稳定可靠地运行。