PHP前端开发

掌握 Python Logging 模块的 10 个技巧

百变鹏仔 1天前 #Python
文章标签 模块

1. 自定义日志级别

除了默认的 DEBUG、INFO、WARNING、ERROR 和 CRITICAL 级别,您可以创建自定义级别。这对于区分不同严重程度的事件非常有用。

import logging# 创建自定义日志级别CUSTOM_LEVEL = logging.INFO + 5logging.addLevelName(CUSTOM_LEVEL, "CUSTOM")# 创建一个 Logger 并设置自定义日志级别logger = logging.getLogger("my_logger")logger.setLevel(CUSTOM_LEVEL)

2. 使用不同处理器

处理器负责将日志事件发送到特定目标,如文件或控制台。您可以自定义处理器以满足您的特定需求。

import logging# 创建一个 FileHandler 并设置日志文件名file_handler = logging.FileHandler("my_log.txt")# 创建一个 StreamHandler 并输出到控制台stream_handler = logging.StreamHandler()# 将处理器添加到 Loggerlogger = logging.getLogger("my_logger")logger.addHandler(file_handler)logger.addHandler(stream_handler)

3. 使用过滤器

过滤器允许您根据特定条件过滤日志事件。这对于仅记录感兴趣的事件非常有用。

import logging# 创建一个过滤器以过滤 INFO 级别以上的事件info_filter = logging.Filter()info_filter.filter = lambda record: record.levelno >= logging.INFO# 将过滤器添加到 Loggerlogger = logging.getLogger("my_logger")logger.addFilter(info_filter)

4. 格式化日志输出

您可以自定义日志事件的格式,以提供所需的信息。

立即学习“Python免费学习笔记(深入)”;

import logging# 创建一个 FORMatter 并设置格式字符串formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")# 将 Formatter 添加到处理器handler = logging.StreamHandler()handler.setFormatter(formatter)# 将处理器添加到 Loggerlogger = logging.getLogger("my_logger")logger.addHandler(handler)

5. 使用上下文处理器

上下文处理器允许您在日志记录时添加额外的信息。这对于跟踪请求或事务中的上下文很有用。

import loggingfrom contextlib import contextmanager# 创建一个上下文处理器以添加请求 ID@contextmanagerdef request_id_context(request_id):previous_request_id = logging.currentframe().f_locals.get("request_id")try:logging.currentframe().f_locals["request_id"] = request_idyieldfinally:logging.currentframe().f_locals["request_id"] = previous_request_id# 使用上下文处理器logger = logging.getLogger("my_logger")with request_id_context("1234"):logger.info("Received request")

6. 使用字典配置

您可以使用字典轻松地配置 Logging 模块。

import logging# 配置字典logging_config = {"version": 1,"formatters": {"default": {"format": "%(asctime)s - %(levelname)s - %(message)s"}},"handlers": {"file": {"class": "logging.FileHandler","filename": "my_log.txt","formatter": "default",},"console": {"class": "logging.StreamHandler","formatter": "default",}},"loggers": {"my_logger": {"handlers": ["file", "console"],"level": "INFO",}}}# 从字典配置 Logginglogging.config.dictConfig(logging_config)

7. 集成第三方包

Logging 模块可以与第三方包集成,例如 Sentry 或 Rollbar。这使您可以轻松地将日志事件发送到远程服务。

import loggingimport sentry_sdk# 初始化 Sentry 并与 Logging 集成sentry_sdk.init()logging.basicConfig(level=logging.INFO, handlers=[sentry_sdk.handler.SentryHandler()])

8. 使用多线程支持

Logging 模块支持多线程应用程序。它使用线程本地存储来确保每个线程都有其自己的独立日志处理器。

import loggingimport threading# 创建线程安全的 Loggerlogger = logging.getLogger("my_logger")# 创建一个线程并向 Logger 记录def thread_function():logger.info("Executing in a separate thread")# 启动线程thread = threading.Thread(target=thread_function)thread.start()

9. 记录异常

Logging 模块可以自动记录发生的异常。

import logging# 创建一个 Loggerlogger = logging.getLogger("my_logger")# 记录一个异常try:raise Exception("An error occurred")except Exception as e:logger.exception(e)

10. 使用扩展日志记录

python 3.8 引入了对扩展日志记录的支持。这允许您创建自定义日志记录函数和处理程序。

import logging# 创建一个自定义日志记录函数def my_log_function(logger, level, msg, *args, **kwargs):# 您的自定义日志记录逻辑# 添加自定义日志记录函数到 Loggerlogger = logging.getLogger("my_logger")logger.addHandler(logging.NullHandler())logger.addFilter(logging.Filter())logger.log = my_log_function