当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 列表。