用 Python Counter 统计日志中的 HTTP 状态码
【摘要】 使用 Python 标准库 Counter 统计状态码文件,检查异常输入,并说明完整日志解析与排障的边界。
排查服务问题时,可以先统计访问日志中的状态码,了解失败请求是否集中。Python 标准库的 collections.Counter 适合做这类小规模离线检查。
下面的示例读取一个每行只包含状态码的 UTF-8 文件。它忽略空行,并检查每个非空行是否为三位数字和有效的 HTTP 状态码范围。
from collections import Counter
from pathlib import Path
def count_status_codes(path: Path) -> Counter[str]:
counts: Counter[str] = Counter()
with path.open(encoding="utf-8") as source:
for line_number, line in enumerate(source, start=1):
code = line.strip()
if not code:
continue
if len(code) != 3 or not code.isascii() or not code.isdecimal():
raise ValueError(f"第 {line_number} 行不是三位数字: {code!r}")
if not 100 <= int(code) <= 599:
raise ValueError(f"第 {line_number} 行的状态码超出范围: {code}")
counts[code] += 1
return counts
if __name__ == "__main__":
counts = count_status_codes(Path("status.txt"))
for code, count in sorted(counts.items()):
print(f"{code}: {count}")
例如,status.txt 包含 200、200 和 503 三行时,结果为 200: 2 和 503: 1。Counter 负责累计次数;sorted 按状态码排序,便于比较不同运行结果。逐行读取不需要一次把整个文件装入内存,但计数器仍会存储出现过的不同状态码。
这个脚本并不直接解析 Nginx 或其他服务的完整访问日志。实际使用前,需要根据日志格式提取状态码;如果字段缺失或格式异常,应保留错误行号并检查原始数据。状态码分布只能帮助缩小排查范围,不能单独证明故障原因,还需结合时间、路径和服务日志分析。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)