面试题答案
一键面试实现思路
- 读取日志文本:首先需要读取包含大量日志的文本文件,可以使用Python的
open()
函数读取文件内容。 - 按行拆分:由于日志是按行记录的,使用
splitlines()
方法将读取的文本内容按行拆分成一个列表,每一个列表元素就是一条日志记录。 - 提取ERROR等级日志:遍历拆分后的日志列表,对每一条日志记录使用
split('|')
方法以|
为分隔符进行拆分,这样可以得到时间戳、日志等级和日志信息三个部分。判断日志等级是否为ERROR
,如果是,则提取对应的日志信息。 - 清洗日志信息:对提取到的
ERROR
等级日志信息,使用字符串方法链式调用。先使用strip()
方法去除前后空格,再使用re.sub()
方法(这里虽然题目要求字符串方法,但实际上re.sub
处理连续空格更方便,可理解为广义字符串处理手段)将连续多个空格替换为单个空格。也可以使用split()
和join()
方法来实现同样效果,即先split()
按空格拆分,再join()
用单个空格连接。
可能遇到的陷阱及规避方法
- 日志格式不规范:可能存在日志格式不符合'时间戳|日志等级|日志信息'的情况。
- 规避方法:在拆分日志记录后,检查拆分后的列表长度是否为3,如果不为3则跳过该条日志记录,或者记录下不规范的日志以便后续排查。
- 性能问题:处理大量日志时,直接在内存中读取和处理可能导致内存占用过高。
- 规避方法:可以采用逐行读取的方式,而不是一次性读取整个文件内容。例如使用
with open(file_path, 'r') as file: for line in file:
的方式逐行处理,减少内存占用。
- 规避方法:可以采用逐行读取的方式,而不是一次性读取整个文件内容。例如使用
- 正则表达式性能:如果使用
re.sub
替换连续空格,复杂的正则表达式可能影响性能。- 规避方法:尽量使用简单高效的正则表达式模式,例如
re.sub(r'\s+', ' ', log_info)
。如果采用split
和join
方法,注意其本身也有一定开销,权衡选择合适方法。
- 规避方法:尽量使用简单高效的正则表达式模式,例如
- 文件编码问题:读取日志文件时,可能遇到文件编码不一致的情况。
- 规避方法:在
open()
函数中显式指定文件编码,如open(file_path, 'r', encoding='utf - 8')
,根据实际文件编码情况选择合适的编码格式。
- 规避方法:在