如何从Python控制台获取qualysapi模块输出的错误信息内容
具体实现方案
共有两种稳定的实现方式:
方式一:捕获qualysapi模块的独立日志
qualysapi的日志是绑定在名为qualysapi的独立logger实例上的,你可以直接给该logger添加自定义handler,实时捕获输出的日志内容,过滤出目标错误信息即可,参考代码如下:
import logging from io import StringIO # 定位qualysapi的logger实例 q_logger = logging.getLogger("qualysapi") q_logger.setLevel(logging.DEBUG) # 创建内存缓冲区存储日志输出 log_buffer = StringIO() stream_handler = logging.StreamHandler(log_buffer) stream_handler.setLevel(logging.DEBUG) stream_handler.setFormatter(logging.Formatter("%(message)s")) q_logger.addHandler(stream_handler) # 此处运行你原本调用Qualys API的业务代码 # ------- 你的业务逻辑开始 ------- # 例如:q_api.request(xxx) # ------- 你的业务逻辑结束 ------- # 解析捕获到的日志内容 all_logs = log_buffer.getvalue() # 过滤4xx/5xx相关错误及详情 error_info = [] log_lines = all_logs.splitlines() for idx, line in enumerate(log_lines): if "Error! Received a 4XX client error" in line: # 错误信息包含当前行及后续的响应内容,可按需截取 error_info.append(line) # 提取后续的XML错误详情 if idx + 1 < len(log_lines): error_info.extend(log_lines[idx+1: idx+10]) break if error_info: print("提取到的错误详情:\n", "\n".join(error_info)) # 释放资源 stream_handler.close() log_buffer.close()
如果模块的logger关闭了向上传播,该方案依然有效,不需要调整模块源码。
方式二:重写请求逻辑自行捕获响应
如果不需要依赖日志,也可以直接重写qualysapi的请求方法,在发请求时直接捕获4xx/5xx响应内容,比捕获日志更稳定可靠:
- 继承qualysapi的连接器类,重写
request方法 - 遇到响应状态码>=400时,直接将响应体内容存入自定义变量,不需要等日志打印
如果只是临时排查问题,也可以直接重定向标准输出到本地文件,后续解析文件提取错误即可,参考代码:
import sys # 重定向标准输出到文件 origin_stdout = sys.stdout sys.stdout = open("./qualys_run_log.txt", "w", encoding="utf-8") # 运行你的业务代码 # ------- 业务逻辑区域 ------- # ------- 业务逻辑区域 ------- # 恢复标准输出 sys.stdout.close() sys.stdout = origin_stdout # 读取文件解析错误内容 with open("./qualys_run_log.txt", "r", encoding="utf-8") as f: log_content = f.read() # 按关键字提取错误即可
内容的提问来源于stack exchange,提问作者Gergo Peltz
相关产品推荐
相关产品推荐

