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

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

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

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

python 复制代码
from collections import deque


def 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)

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

python 复制代码
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 -= 1
            file.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 列表。

相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
ValhallaCoder5 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话7 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽5128 小时前
Scrapy框架入门指南
python·scrapy
MZ_ZXD0018 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石9 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜9 小时前
Python入门篇【模块/包】
python
阔皮大师10 小时前
INote轻量文本编辑器
java·javascript·python·c#