You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Logging:仅显示自研库日志的实现方案问询

实现思路与代码示例

核心思路

利用Python日志系统的logging.Filter自定义过滤规则,通过文件路径对比自动区分自研代码与第三方库:第三方库通常安装在Python的site-packages目录下,而自研脚本/库的代码路径则在项目本地目录或自定义路径中,以此作为判断依据,无需硬编码库名。

具体实现步骤

1. 获取第三方库的安装路径(site-packages)

通过site模块获取所有site-packages目录,作为排除规则的基准:

import site
import os

# 获取所有第三方库安装路径
site_packages_dirs = [os.path.normpath(p) for p in site.getsitepackages()]
# 额外处理user site-packages(pip install --user的情况)
user_site = site.getusersitepackages()
if user_site:
    site_packages_dirs.append(os.path.normpath(user_site))

2. 自定义日志过滤器

编写CustomDebugFilter类,重写filter方法,判断日志记录是否来自自研代码:

import logging
import inspect

class CustomDebugFilter(logging.Filter):
    def __init__(self, script_path):
        self.script_dir = os.path.normpath(os.path.dirname(script_path))
    
    def filter(self, record):
        # 仅处理DEBUG级别的日志
        if record.levelno != logging.DEBUG:
            return False
        
        # 获取日志记录对应的模块文件路径
        try:
            # 通过调用栈获取日志所属模块的文件路径
            frame = inspect.stack()[1][0]
            module = inspect.getmodule(frame)
            if not module or not hasattr(module, '__file__'):
                return False
            module_path = os.path.normpath(module.__file__)
        except (AttributeError, TypeError, IndexError):
            # 处理无法获取文件路径的情况(如内置模块)
            return False
        
        # 规则1:当前脚本及其子目录下的代码
        if module_path.startswith(self.script_dir):
            return True
        
        # 规则2:不在site-packages目录下的代码(自研库)
        for pkg_dir in site_packages_dirs:
            if module_path.startswith(pkg_dir):
                return False
        return True

3. 配置日志系统

将自定义过滤器绑定到文件处理器上,确保只有符合规则的DEBUG日志被写入文件:

def setup_logging():
    # 创建根日志记录器
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)  # 全局开启DEBUG级别,确保过滤器能捕获所有目标日志
    
    # 创建文件处理器,专门存储自研代码的DEBUG日志
    file_handler = logging.FileHandler('app_debug.log')
    file_handler.setLevel(logging.DEBUG)
    
    # 添加自定义过滤器
    file_handler.addFilter(CustomDebugFilter(__file__))
    
    # 设置日志格式
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    
    # 将处理器添加到记录器
    logger.addHandler(file_handler)
    
    # 可选:控制台输出INFO及以上级别日志,避免DEBUG信息刷屏
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

# 初始化日志配置
setup_logging()

补充说明

  • 若自研库有统一命名前缀(如所有库以my开头),可结合record.name辅助过滤,比如判断record.name.startswith('my'),和路径规则形成双重校验,提升准确性。
  • 对于通过pip install -e安装的可编辑自研库,代码路径不在site-packages(仅存链接),上述路径规则依然有效,因为实际代码文件在本地项目目录。
  • 可根据项目需求调整过滤规则,比如添加特定自研库根目录到白名单,进一步缩小日志范围。

内容的提问来源于stack exchange,提问作者Fabri Ba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:20:44