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
相关产品推荐
相关产品推荐

