Gianjiji/scoobyLog
GitHub: Gianjiji/scoobyLog
一款 Python 编写的 Splunk CSV 日志分析工具,自动解析日志、检测异常、定位根因并生成完整的 Incident Response 报告。
Stars: 0 | Forks: 0
# scoobyLog
**Splunk 事件分析器** — 高级 Python 工具,用于处理从 Splunk 导出的 CSV 文件,并生成完整的 Markdown 或 HTML 格式的 Incident Response 报告。
```
scoobylog v4.3
```
## 功能简介
基于从 Splunk 导出的 CSV,scoobyLog 会自动执行:
- 解析任何格式的时间戳(ISO 8601、Apache/nginx、syslog、秒/毫秒级 epoch)
- 按时间顺序排序并标准化为 UTC
- 通过唯一键(会话、request ID、源 IP 等)隔离最异常的流程
- 通过 regex 进行异常检测:OOM、segfault、磁盘已满、timeout、身份验证失败、stack trace、slow query、连接池耗尽等
- 识别 **root cause**(根因)— 即错误链中的第一个错误 — 并测量级联深度
- 计算 **MTTR** (Mean Time To Recover) 并检测 **SLA 违规** (P1–P4)
- 生成完整的 **Incident Response 报告**,包含时间线、ASCII 事件链、网络证据、按主机划分的影响矩阵、RCA 分析、用于复现事件的 SPL 查询以及技术 playbook
## 系统要求
```
Python 3.8+
pandas >= 1.3.0
numpy >= 1.21.0
```
安装依赖项:
```
pip install -r requirements.txt
```
## 使用方法
```
# 位置参数 / drag & drop
python scoobylog.py logs.csv
# 带 flag 形式
python scoobylog.py --input logs.csv
# Report HTML,在浏览器中打开
python scoobylog.py --input logs.csv --format html --open
# 在 stdout 上快速输出 TLDR 摘要(不写入文件)
python scoobylog.py --input logs.csv --summary
# 从 stdin 读取(通过 pipe 从 Splunk CLI、curl 等传入)
cat export.csv | python scoobylog.py --input -
# 机器可读的 JSON + 增强的 CSV,不生成 Markdown report
python scoobylog.py --input logs.csv --no-report --json-summary --export-csv arricchito.csv
# 时间范围 + 最低级别过滤器
python scoobylog.py --input logs.csv --since 2024-03-15T08:00:00Z --until 2024-03-15T09:00:00Z --min-level ERROR
# 在共享前对 IP、会话 ID、UUID 和电子邮件进行匿名化处理
python scoobylog.py --input logs.csv --anonymize
# 将 JSON 摘要发送到 Slack/PagerDuty/Opsgenie webhook
python scoobylog.py --input logs.csv --alert-webhook https://hooks.example.com/incident
# 使用自定义 pattern 扩展检测
python scoobylog.py --input logs.csv --patterns-file pattern_custom.json
```
## CLI 选项参考
| Flag | 默认值 | 描述 |
|---|---|---|
| `CSV_FILE` | — | 位置输入文件(支持拖放) |
| `--input / -i` | — | Splunk CSV 的路径(`-` 表示 stdin) |
| `--output / -o` | `_incident_report.md` | 输出文件的路径 |
| `--output-dir` | — | 用于存放所有输出文件的文件夹 |
| `--timestamp-col` | 自动 | 时间戳列的名称 |
| `--level-col` | 自动 | log level 列的名称 |
| `--flow-key` | 自动 | 唯一流程键的列名 |
| `--flow-value` | 自动(最异常) | 要隔离的特定流程值 |
| `--no-flow` | 禁用 | 禁用流程隔离 |
| `--encoding` | utf-8 | CSV 文件的编码 |
| `--max-rows` | 30 | 时间线表格中的最大行数 |
| `--chain-depth` | 12 | ASCII 链中的最大事件数 |
| `--since` | — | 丢弃早于此 ISO 8601 时间戳的事件 |
| `--until` | — | 丢弃晚于此 ISO 8601 时间戳的事件 |
| `--min-level` | — | 时间线的最低 log level |
| `--max-events N` | — | 仅处理前 N 个事件(快速 triage) |
| `--json-summary` | 禁用 | 在生成报告的同时写入 `IR-.json` |
| `--export-csv PATH` | — | 将增强后的 DataFrame 导出为 CSV |
| `--patterns-file PATH` | — | 包含自定义检测 pattern 的 JSON 文件 |
| `--alert-webhook URL` | — | 将 JSON 摘要发送到 webhook |
| `--anonymize` | 禁用 | 对 IP、会话 ID、UUID 和 email 进行假名化处理 |
| `--format {md,html}` | md | 输出格式 |
| `--open` | 禁用 | 生成后在浏览器中打开报告 |
| `--no-report` | 禁用 | 跳过报告生成 |
| `--summary` | 禁用 | 将 TLDR 打印到 stdout 并退出 |
| `--quiet / -q` | 禁用 | 抑制进度输出 |
| `--version` | — | 打印版本并退出 |
## 报告结构
```
§0 Quick Reference — tabella pronta da incollare nel ticket
§1 Executive Summary + §1.1 Narrazione dell'Incidente
§2 Statistiche + §2.1 Impatto per Servizio (DOWN/DEGRADED/OK per sourcetype)
§3 Timeline eventi + §3.1 Catena ASCII + §3.2 Grafico densità errori + §3.3 Analisi Burst
§4 Analisi Precursori
§5 Analisi per Flusso + §5.1 Dettaglio flusso critico
§6 Matrice impatto per Host (Stato: DOWN/DEGRADED/OK)
§7 Recovery Timeline per Host (con durata downtime)
§8 Breakdown anomalie + §8.1 Co-occorrenze + §8.2 Sourcetype + §8.3 Errori ricorrenti
§9 Integrità Log — Gap Analysis
§10 Matrice Flussi di Rete (src → dst)
§11 Evidenze di Rete (IP, porte, URL, timeout, fallimenti auth, errori DNS)
§12 Estratti Log Raw (top 5 errori, ordinati per severità)
§13 RCA + §13.1 Evento root + §13.2 Cascata + §13.3 Cross-Host + §13.4 Lista cause
§14 Azioni Raccomandate + §14.1 Playbook Tecnico (rimedi per pattern)
§15 Appendice — §15.1 Colonne + §15.2 Parametri + §15.3 Query SPL (×3)
```
## 自定义 Pattern
无需修改脚本即可扩展内置检测功能:
```
{
"patterns": {
"mio_pattern": "stringa regex"
},
"labels": {
"mio_pattern": "**Etichetta** — descrizione per la lista cause"
},
"remediation": {
"mio_pattern": [
"Passo 1: ...",
"Passo 2: ..."
]
}
}
```
通过 `--patterns-file pattern_custom.json` 传入。
## 检测能力
**异常 Pattern**:OOM killer、segfault、磁盘已满、CPU 飙升、服务重启、TLS/SSL 证书错误、kernel panic、stack trace、slow query、连接池耗尽
**网络 Pattern**:IPv4/IPv6、端口、URL、MAC、timeout/ETIMEDOUT/ECONNRESET、身份验证失败 (401/403)、DNS 错误 (NXDOMAIN/SERVFAIL)、丢包/retransmit
**高级分析**:统计突发检测(均值+2σ)、自适应间隔检测(75 百分位数×5)、跨主机级联关联(2 秒窗口)、SLA 违规检测 (P1–P4)、事件趋势(ESCALATING/STABLE/RECOVERING)、RCA 置信度评分(ALTA/MEDIA/BASSA)
## JSON 摘要 schema
使用 `--json-summary` 时,scoobyLog 会写入包含以下内容的 `IR-.json`:
```
{
"version": "4.3",
"incident_id": "IR-XXXXXXXX",
"analyzed_at": "...",
"source_file": "...",
"total_events": 21,
"error_events": 11,
"warning_events": 5,
"anomaly_events": 14,
"host_count": 5,
"severity": { "score": 62, "grade": "P2 — ALTO", "components": {} },
"trend": "...",
"service_impact": "DEGRADED",
"mttr_seconds": 75.0,
"cascade_count": 10,
"root_cause_ts": "...",
"root_cause_level": "ERROR",
"root_cause_host": "lb-01",
"root_cause_tags": ["timeout"],
"playbook_patterns": ["timeout", "oom_killer"],
"network_evidence": {},
"burst_count": 1,
"log_gaps": [],
"duplicate_count": 0,
"recovery_timeline": []
}
```
## 快速测试
```
python scoobylog.py sample_splunk.csv
# → sample_splunk_incident_report.md (模拟 MySQL OOM → 级联 failure)
```
预期输出:
```
[✓] Root cause: ERROR @ 2024-03-15T08:01:45Z su lb-01 (timeout)
[✓] Cascata: 10 errori downstream | MTTR: 1m 15s
[✓] Severity: 62/100 — P2 ALTO
```
## 许可证
MIT — 见 [LICENSE](LICENSE)
标签:Python, 无后门, 自动化报告, 运维监控, 逆向工具