关于 log-analyzer
用于分析服务和 Agent 运行日志的 Python 技能,可将重复错误归类并生成结构化异常报告。适合需要调试日志或生成定时摘要的运维人员与 Agent。
主要功能
- 01归一化并聚类重复错误
- 02检测限流、超时与工具故障
- 03按组件统计错误和警告
- 04生成 JSON 与 Markdown 报告
- 05支持静默定时扫描
适用场景
- 01排查 Agent 运行异常
- 02汇总定时任务日志问题
- 03对比部署前后的错误变化
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ moonlight-lupin/ agent-skills --skill log-analyzer安装后在 Claude Code 中输入/log-analyzer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/anomaly-types.mdhermes-profile-audit.mdlog-formats.mdstate-failure-monitor.mdscripts/analyze_logs.pyhermes_log_window.pystate_failures.pytests/test_analyze_logs.pytest_state_failures.py详细介绍
日志分析器
概述
日志查看器会筛选行。本技能会查找模式。
当 Agent 运行时、工具进程、网关、调度器或其他服务产生了大量日志,单独的 grep 匹配结果已不足以解释系统行为时,可使用此技能。分析器会解析标准日志行,对重复消息进行规范化,按组件和工具对错误分组,并生成结构化异常报告,适用于调试会话或 cron 摘要。
该脚本有意保持轻量且可移植:它仅使用 Python 标准库,可处理任何包含时间戳、级别、可选组件和消息字段的文本日志。对于非结构化日志,它也提供尽力而为的回退处理。
快速开始
cd agent-ops/log-analyzer
python scripts/analyze_logs.py scan --log-file agent.log --since 24h
要从 Hermes 配置文件的会话 DB 获取每个工具的失败率(基于结构化的 exit_code 信号,而非对内容使用正则表达式):
python scripts/state_failures.py # last 7 days, dashboard
python scripts/state_failures.py --days 30 --json
python scripts/state_failures.py --quiet # cron: silent when healthy
参见 references/state-failure-monitor.md,了解来源信息(改编自 hermes-dojo 的概念)、说明结构化信号为何重要的峰值证据,以及解读说明。
要写入 JSON,以供后续渲染为 Markdown:
python scripts/analyze_logs.py scan --log-file agent.log --since 24h --output scan.json
python scripts/analyze_logs.py report --scan scan.json --output report.md
要进行兼容 cron 的异常检测:
python scripts/analyze_logs.py scan --log-file agent.log --since 24h --quiet
如果未发现异常,--quiet 会以 0 退出且不打印任何内容。如果存在异常,它会输出 JSON 报告,以便调度器发送摘要。
检测内容
- 错误集群 — 在所选时间范围内重复 3 次或以上的相同规范化错误消息。分组前会将 URL、IP 地址和数字替换为占位符,因此即使重复失败的 ID 不同,也能归入同一集群。
- 限流命中 — HTTP
429、rate limit、rate_limit、too many requests和quota exceeded模式。如果能检测到提供方名称,分析器会按提供方对这些结果分组。 - 超时模式 —
timeout、timed out、deadline exceeded和connection timeout。结果按检测到的工具名称分组,并包含日志中出现的示例 URL。 - 工具失败 — 按从
tool: terminal、tool_call: web_search、tool terminal failed等模式中提取的工具名称,或由tools组件输出的错误行分组。 - 会话崩溃 — 致命错误、未处理的异常、堆栈跟踪、
Traceback、Exception和segfault标记。多行堆栈跟踪会与附近的上下文一起归为一条崩溃记录。 - 组件细分 — 按组件统计错误和警告数量,例如
gateway、agent、tools、cron或unknown。 - 错误时间线 — 按小时分桶统计错误数量,以发现部署或计划任务后的峰值和回归。
检测标准和解读说明请参见 references/anomaly-types.md。
日志格式支持
解析器可处理以下格式的标准日志行:
2026-07-06 12:30:45 ERROR [gateway] Connection refused
2026-07-06T12:30:45Z ERROR gateway: Connection refused
12:30:45 ERROR Connection refused
它可识别 ERROR、WARN、WARNING、INFO、DEBUG、FATAL 和 CRITICAL 级别。组件可以出现在级别后的方括号中,也可以作为级别后的 component:。仅包含时间的行会以当天为基准(作为库调用时,则以提供的默认日期为基准)。对于非结构化行,解析器会逐行尽力扫描,因此即使无法解析时间戳,明显的 ERROR/WARN 字符串仍会被计数。
示例和添加自定义模式的指南请参见 references/log-formats.md。
CLI 命令
scan — 分析日志文件中的模式
python scripts/analyze_logs.py scan --log-file LOGFILE [--since TIME] [--output report.json] [--quiet]
选项:
--log-file LOGFILE— 必填的日志文件路径。--since TIME— 可选的时间范围:分钟/小时/天/周,例如30m、1h、24h、7d、2w;默认包含所有行。--output report.json— 将 JSON 写入文件,而不是标准输出。--quiet— cron 模式:未发现异常时不输出内容。
report — 根据扫描 JSON 渲染 Markdown
python scripts/analyze_logs.py report --scan scan.json [--output report.md]
报告包含概览计数、每种异常类型各自的一个分节、组件细分表格,以及按小时统计的错误时间线。
tail — 最近行智能 tail
python scripts/analyze_logs.py tail --log-file LOGFILE [--lines N] [--since TIME]
智能 tail 会输出纯文本,并带有适合在聊天中发送的标记:
- 普通行:无标记
- 警告:
⚠️ - 错误:
❌ - 重复出现的近期错误:当同一规范化错误出现 3 次或以上时,标记为
🔥
输出格式
scan 会输出包含以下顶层字段的 JSON:
log_file、lines_analyzed、time_windowanomalies.error_clusters、anomalies.rate_limits、anomalies.timeouts、anomalies.tool_failures、anomalies.crashescomponent_breakdownerror_timelinetotal_errors、total_warnings、has_anomalies
report 会将该 JSON 转换为 Markdown:
# Log Analysis Report
## Overview
- Log file: agent.log
- Lines analyzed: 1542
- Time window: 24h
- Total errors: 12 | warnings: 20
- Anomalies detected: 5 types
定时摘要集成
对于定时摘要,请以静默模式运行 scan,仅在输出非空时将其包含在内:
python scripts/analyze_logs.py scan --log-file /var/log/agent.log --since 24h --quiet --output /tmp/log-scan.json
if [ -s /tmp/log-scan.json ]; then
python scripts/analyze_logs.py report --scan /tmp/log-scan.json
fi
scheduled-summary 作业可以将 Markdown 输出添加到“Log anomalies”标题下。请让分析时间窗口与摘要时间窗口保持一致(例如,每日摘要使用 24 小时),以免计数重叠或遗漏。
对于 state.db 故障率摘要(考虑到会话数量,每周一次是合理的频率):
python scripts/state_failures.py --quiet --days 7
如果时间窗口内没有故障,该命令不会输出任何内容(退出码为 0),因此可将其用作 no_agent cron 作业,仅在出现问题时发送通知。有关类别含义,请参阅 references/state-failure-monitor.md(在实际数据中,超时最值得采取行动)。
常见陷阱
- 日志轮转会破坏时间窗口。 如果昨天的文件已被轮转移出,仅扫描当前文件的
--since 24h可能会漏掉时间窗口前段的故障。 请让调度器同时读取活动文件和轮转文件,或者在扫描前拼接相关文件。 - 多行堆栈跟踪需要首行。 解析器会将缩进的堆栈跟踪续行归到前一条已解析的日志行下。如果日志
收集器删掉了首行
Traceback或ERROR,剩下的堆栈帧就会变成无结构的上下文。 - 预期中的错误可能造成误报。 重试、探测和健康检查可能会有意输出警告或连接失败信息。请将 错误簇视为“需要调查”的信号,而不是自动判定为事故。
- 首次扫描大量历史日志可能导致输出过多。 先使用
--since 24h,检查报告,然后在需要时扩大 时间窗口。 - 更改消息格式可能会拆分错误簇。 如果应用在部署期间更改了错误字符串,即使根本原因相同,部署 前后的故障也可能显示为两个错误簇。
- 仅包含时间的日志取决于扫描日期。
12:30:45 ERROR ...行不包含日期。对于历史文件,请优先使用完整时间戳。 - 带逗号毫秒部分的 Python 日志行会导致
--since静默失效。 格式为2026-07-06 12:30:45,123 INFO module: ...的行(Hermes agent/gateway/errors 日志)与内置时间戳正则表达式不匹配。它们会回退到非结构化解析,timestamp=null,因此--since无法过滤这些行, 整个未轮转文件都会被扫描。症状:错误/traceback 计数远超真实时间窗口内的数量,每个错误簇都显示 "First: unknown / Last: unknown",错误时间线显示 "No timestamped errors detected",崩溃数也被夸大(每条堆栈跟踪续行都会被计为一次单独的崩溃)。修复方法: 对于 Hermes 配置文件日志,请使用带时间窗口的计数器scripts/hermes_log_window.py(可处理逗号毫秒格式,并且仅通过统计Traceback (most recent call last)首行来对多行 traceback 去重);从配置文件的state.db中提取技能使用/工具调用计数的方法,请参阅references/hermes-profile-audit.md。 - 技能使用次数不在 agent.log 中。
tool skill_view completed (0.05s, 13890 chars)行不包含技能名称参数。请查询配置文件state.db的messages表——tool_callsJSON 列保存了完整参数。messages.timestamp是 Unix epoch(REAL),而非 ISO 格式。可直接运行的代码片段请参阅references/hermes-profile-audit.md。 - 错误时间线按一天中的时刻分桶,而非按日期。 在跨多天的时间窗口(
--since 7d)内,不同日期 08:00 的错误会合并到同一个08:00柱中。进行多天取证时,请使用带完整时间戳的错误簇;将时间线视为一天中各时段的分布。 - 崩溃检测基于子字符串匹配。 崩溃正则表达式会匹配行内任意位置出现的
fatal或Exception等词语,因此 INFO 行中提及这些词语(例如“重试在 TimeoutException 后成功”、“non-fatal warning”)也会被计为崩溃信号,并可能设置has_anomalies。请将崩溃计数视为需要人工核查的线索;如果日志会在 INFO 级别正常提及异常,请调整正则表达式。
此技能不是什么
- 不是日志查看器:需要检查原始日志行时,请使用
tail、less或日志 UI。 - 不是日志采集器:它不会将日志转发到存储或可观测性系统。
- 不是 SIEM:它不会关联身份、网络或安全事件。
- 不是实时监控:
tail是近期日志分析器,不是守护进程或告警服务。 - 不是根因判定工具:它会突出显示模式,帮助 Agent 或操作人员更快地进行调查。
验证清单
- 运行
python scripts/analyze_logs.py --help,确认子命令已加载。 - 扫描包含重复错误的合成日志,确认
has_anomalies为 true。 - 根据扫描 JSON 渲染 Markdown,确认所有异常部分均已显示。
- 在此技能目录中运行
python -m pytest tests/test_analyze_logs.py -v。 - 在此技能目录中运行
python -m pytest tests/test_state_failures.py -v(state.db 故障率监控;尖峰回归测试——仅提及错误词语的内容不得计为故障——位于此处)。 - 用于 cron 时,使用
--quiet测试无异常日志,并确认 stdout 为空且退出代码为 0。 - 用于 state.db cron 时,针对运行中的配置文件 DB 执行
python scripts/state_failures.py --quiet,确认在时间窗口内没有故障时退出代码为 0 且不打印任何内容。