当前位置: 首页 > news >正文

python获取iOS最近业务日志的两种方法

当iOS UI自动化用例执行失败的时候,需要获取当时的业务日志,供后续分析使用。

现在已经把iOS沙盒目录挂载到本地,剩下的事情就是从沙盒目录中捞取当前的日志,沙盒中的日志文件较大,整体导出来也可以,但是会有些无用的日志,最好是能获取到UI自动化执行失败时,当时的日志,因为那时日志已经打印到日志文件中,只需捞取一定量的日志即可,可供精准分析。

有两种方法,一种实现较简单,一种稍复杂些

from collections import dequedef get_last_lines_from_file(file_path, num_lines):with open(file_path, 'r') as file:last_lines = deque(file, maxlen=num_lines)return list(last_lines)

这个方法适用于从较小到中等大小的日志文件中捞取日志。

def get_last_lines_from_file_by_file_offset_mode(file_path, num_lines):"""使用文件偏移量方式获取日志:param file_path:日志文件路径:param num_lines:行数:return:"""if not os.path.isfile(file_path):print(f"日志文件不存在:{file_path}")return []with open(file_path, 'rb') as file:file.seek(0, 2)file_size = file.tell()lines_found = []buffer = bytearray()while len(lines_found) <= num_lines and file_size > 0:file_size -= 1file.seek(file_size)byte = file.read(1)buffer.extend(byte)if byte == b'\n':line = buffer[::-1].decode(errors='ignore').strip()lines_found.append(line + '\n')buffer = bytearray()# 当文件内容小于指定的行数是执行到这里,这行是最顶部的那一行if buffer:line = buffer[::-1].decode(errors='ignore').strip()lines_found.append(line)return list(reversed(lines_found))

这个方法是从文件末尾向前读取,适合更大的文件,因为不会将整个文件读入内存。

在调试这个方法的时候遇到了一些问题,刚开始用的是:

if buffer[0:1] == b'\n':

    lines_found.append(buffer[::-1].decode(errors='ignore').strip())

    buffer = bytearray()

但是结果是捞取了全部的日志内容,并不是我指定的最新的1000行。

这时打印 lines_found 的长度一直是1,并不是期望的递增,说明buffer 中的数据没有被正确地切分为行,这段代码没有被执行到。

所以调整了判断条件,每次读取一个字节(file.read(1))并检查 byte == b'\n'。如果检测到换行符,表示找到一行,将 buffer 中的内容翻转解码并添加到 lines_found 列表。

http://www.lryc.cn/news/482361.html

相关文章:

  • 【如何获取股票数据43】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深指数历史交易数据获取实例演示及接口API说明文档
  • ESLint 使用教程(一):从零配置 ESLint
  • openssl对称加密代码讲解实战
  • web前端动画按钮(附源代码)
  • go函数传值是值传递?还是引用传递?slice案例加图解
  • PostgreSQL数据库笔记
  • 财务软件源码SaaS云财务
  • Elasticsearch集群和Kibana部署流程
  • 丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索
  • 【Django】Clickjacking点击劫持攻击实现和防御措施
  • Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析
  • 工具收集 - java-decompiler / jd-gui
  • 《无线重构世界》射频模组演进
  • 渗透测试---docker容器
  • 【go从零单排】Atomic Counters原子计数
  • VSCode中python插件安装后无法调试
  • 用react实现radio同时关联proform组件
  • Objective-C 1.0和2.0有什么区别?
  • TCP连接如何保障数据传输安全
  • 【论文复现】ChatGPT多模态命名实体识别
  • 管理 Elasticsearch 变得更容易了,非常容易!
  • SynchronousQueueworkQueue.offer() 和 poll() 方法的超时控制及线程池的讨论
  • 自动驾驶---“火热的”时空联合规划
  • 命令行工具进阶指南
  • 扫雷游戏代码分享(c基础)
  • 基于vue框架的的社区居民服务管理系统8w86o(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 一分钟快速熟悉makedown
  • P8649 [蓝桥杯 2017 省 B] k 倍区间:同余,前缀和,组合数,区间个数
  • 产业与学术相互促进,2024年OEG海上能源博览会助力全球能源可持续发展
  • 【GDB调试】智慧中控项目的调试