用 Python Counter 统计日志中的 HTTP 状态码

举报
yd_251192881 发表于 2026/11/04 15:30:49 2026/11/04
【摘要】 使用 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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。