这次分享一道 Intel 面试中出现过的 log parsing 题目,原题很短:
Parse log file count number of error and group by time
中文理解就是:给一份日志文件,统计里面有多少条 ERROR,并且按照时间进行分组。
这类题看起来像简单字符串处理,但真实面试里最容易出问题的地方不是代码,而是题目太模糊。面试官没有明确说日志格式,也没有说按 year、month、day 还是 hour 分组。如果候选人一上来就写代码,很容易写死 sample,后面被追问时就会比较被动。
面试中应该先确认什么?
我们当时辅助候选人的第一步,是先让他把需求说清楚:
I will assume each log line starts with a timestamp, followed by log level like INFO or ERROR. I will count the lines whose level is ERROR, and group them by a time bucket such as year, month, day, or hour.
这里有几个关键点:
首先,不要简单判断一行里是否包含 "ERROR"。因为有些日志的 message 里也可能出现 ERROR 这个词,但真正判断日志级别时,应该看 log level 字段。
例如:
2023-01-10 10:15:32 ERROR Disk failure at node 3
2023-01-10 10:16:20 INFO Previous ERROR has been resolved第二行虽然包含 ERROR,但它的 level 是 INFO,所以不应该算作错误日志。
基本解题思路
整体思路可以分成三步:
- 逐行读取 log file,避免一次性把大文件全部加载到内存。
- 对每一行解析 timestamp 和 log level。
- 如果 level 是 ERROR,就根据指定的时间粒度更新计数。
核心代码可以写得很简单:
def count_errors_by_time(lines, granularity="year"):
result = {}
for line in lines:
parts = line.strip().split()
if len(parts) < 3:
continue
date = parts[0]
time = parts[1]
level = parts[2]
if level != "ERROR":
continue
if granularity == "year":
key = date[:4]
elif granularity == "month":
key = date[:7]
elif granularity == "day":
key = date
else:
key = date + " " + time[:2]
result[key] = result.get(key, 0) + 1
return result这段代码的重点不是语法,而是结构清楚:解析日志、判断级别、生成时间分组 key、累加计数。
面试官可能会追问什么?
这道题常见 follow-up 是:如果日志文件很大怎么办?
这时可以回答:真实场景中应该用 file stream,一行一行读,而不是先把整个文件读进内存。这样空间复杂度主要取决于分组数量,而不是日志文件大小。
还有一个常见追问是:如果要按不同时间粒度分组怎么办?
这时可以说,主逻辑不用变,只需要改变 time key 的生成方式。例如按年是 2023,按月是 2023-01,按天是 2023-01-10,按小时是 2023-01-10 10。
这样回答会比只写一个固定按 year 分组的版本更稳。
复杂度分析
如果日志一共有 n 行,每行平均长度有限,那么时间复杂度可以看作 O(n),因为每一行只处理一次。
空间复杂度是 O(k),其中 k 是不同时间分组的数量。比如按 year 分组,k 通常很小;按 hour 分组,k 会变大一些,但仍然远小于完整日志数量。
这道题真正考什么?
这道 Intel 面试题表面上是 log parsing,实际考的是候选人处理模糊需求的能力。
面试官想看的不是候选人能不能写出几行 Python,而是能不能主动澄清日志格式,能不能避免错误判断,能不能考虑大文件场景,能不能把 group by time 设计得更灵活。
我们在辅助这类面试时,也不会只给候选人一段代码,而是会帮他组织现场表达:
First, I will clarify the log format and grouping granularity. Then I will read the file line by line, parse timestamp and log level, and only count lines where the level is ERROR. Finally, I will group the count by the required time bucket.
这样的回答更像真实工程师的解题过程,也更容易应对面试官后续追问。对于 csoahelp 来说,这正是实时面试辅助的价值:不只是写出答案,而是帮候选人在现场把思路讲清楚、把边界条件补完整、把 follow-up 接住。
csoahelp 做的就是这种场景里的实时辅助,题目刚读完就能给出完整思路,现场不用卡壳。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

