From 7d1d9504e133e752d39284f1ec1b315f670bafad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A0=83=E8=90=A5?= <1572506709@qq.com> Date: Wed, 7 Oct 2026 23:48:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E7=A8=8B=E9=A2=981=EF=BC=9AJSON=20?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=AE=A1=E9=81=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++++ q1/main.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 .gitignore create mode 100644 q1/main.py 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