diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e652c23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Python 缓存 +__pycache__/ +*.pyc +*.pyo diff --git a/q1/main.py b/q1/main.py new file mode 100644 index 0000000..971a978 --- /dev/null +++ b/q1/main.py @@ -0,0 +1,47 @@ +import json +import os + + +def analyze_log(filepath: str) -> dict: + """解析 JSON Lines 日志文件,返回统计结果。""" + # 结果字典,先填好默认值(也就是空结果) + result = { + "total": 0, + "by_level": {}, + "by_user": {}, + "last_error": None, + } + + # 文件不存在时,直接返回空结果,不报错 + if not os.path.exists(filepath): + return result + + with open(filepath, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + # 空行跳过 + if not line: + continue + + # 某行不是合法 JSON 就跳过这一行,不影响整体解析 + try: + data = json.loads(line) + except json.JSONDecodeError: + continue + + # 成功解析一条,总数加一 + result["total"] += 1 + + # 按 level 计数 + level = data["level"] + result["by_level"][level] = result["by_level"].get(level, 0) + 1 + + # 按 user 计数 + user = data["user"] + result["by_user"][user] = result["by_user"].get(user, 0) + 1 + + # 记录最后一条 ERROR 的 message + if level == "ERROR": + result["last_error"] = data["message"] + + return result