You need to enable JavaScript to run this app. Python解析ticky服务syslog日志生成CSV报表返回空表求助
优惠活动
大模型
产品
解决方案
定价
更多

Python解析ticky服务syslog日志生成CSV报表返回空表求助

运行后表格为空的核心原因

脚本的统计逻辑、CSV写入逻辑无问题,输出空表的原因全部来自正则匹配环节的错误:

  • 强制要求日志正文必须包含[#数字]格式的工单号,但样例中的ERROR级日志根本不存在这个结构,直接导致所有ERROR行匹配失败
  • 正则语法误用:
    • 把ERROR、INFO包在[]字符组里,实际匹配效果是枚举E/R/O/I/N/F的任意字符组合,根本无法识别完整的日志级别字符串
    • 代码中错误将HTML转义实体<、>写进了命名捕获组的语法结构里,导致正则引擎根本识别不了message这类自定义捕获组,匹配逻辑完全失效
  • 开头写的时间部分的正则匹配规则过于模糊,和实际日志的固定时间格式(如Jan 31 16:35:46)不兼容,进一步降低了匹配成功率
修正方案

所有ticky服务输出的日志都有固定结构:[时间] [主机名] ticky: [日志级别] [日志正文] ([用户名]),不需要拆分INFO、ERROR两套正则,用一条通用正则就能覆盖所有格式,无需强制要求正文中必须带工单号。
对应的正则规则为:
ticky: (ERROR|INFO) (?P<message>.*) \((?P<username>\w+)\)$

规则逻辑:跳过前面无意义的时间、主机名字段,直接匹配ticky服务的固定输出标识,依次抓取日志级别、正文内容、括号内的用户名,能适配所有样例中的日志格式。

修正后的完整可运行代码如下:

#!/usr/bin/env python3
import re
import csv
import operator

errors = {}  # 统计不同错误信息的出现次数
per_user = {}  # 按用户名统计 [INFO次数, ERROR次数]

logfile = 'syslog.log'
# 预编译正则提升匹配效率
log_pattern = re.compile(r'ticky: (ERROR|INFO) (?P<message>.*) \((?P<username>\w+)\)$')

with open(logfile, 'r') as f:
    for line in f:
        match = log_pattern.search(line)
        if not match:
            continue
        level, message, username = match.groups()
        # 初始化用户计数项
        per_user.setdefault(username, [0, 0])
        if level == 'ERROR':
            errors[message] = errors.get(message, 0) + 1
            per_user[username][1] += 1
        else:
            per_user[username][0] += 1

# 按规则排序
error_sorted = sorted(errors.items(), key=operator.itemgetter(1), reverse=True)
per_user_sorted = sorted(per_user.items())

# 写入错误统计报表,newline='' 避免CSV出现空行
with open('error_report.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Error', 'Count'])
    writer.writerows(error_sorted)

# 写入用户行为统计报表
with open('per_user_report.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Username', 'INFO', 'ERROR'])
    for username, counts in per_user_sorted:
        writer.writerow([username, counts[0], counts[1]])
样例日志测试结果
  • error_report.csv将按错误计数从高到低列出:Connection to DB failed(2次)、Timeout while retrieving information(1次)、The ticket was modified while updating(1次)
  • per_user_report.csv将按用户名排序列出:bpacheco(INFO 0、ERROR 1)、mcintosh(INFO 2、ERROR 1)、oren(INFO 0、ERROR 2)

内容的提问来源于stack exchange,提问作者Julia Martynenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 09:36:10