Hermes Agent 日志分析实操:三步把日志接进 ELK,再自动盯住异常
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
Hermes Agent(口号是 "The agent that grows with you")是个会陪你长大的 AI 代理框架,它把每次会话、网关状态变化都落成了本地日志。这篇文章带你把 Hermes Agent 的日志接进 ELK 做集中分析,并用一个定时任务让错误量自己报警,读完照着敲就能跑通。
先说配好后的效果
配完之后你能在三个地方看到东西:本地~/.hermes/logs/下实时滚动的运行日志;Elasticsearch 里按天切分的hermes-logs-*索引;Kibana 上一个能按错误级别、子系统过滤的仪表板。再加一个 cron 任务后,错误量突然翻倍时你会先于用户发现问题。
动手前:环境、组件、要动的文件
- 组件:Hermes Agent 本体;Elasticsearch、Logstash、Kibana 各一个容器即可;如果想走 OTLP 上报路线,还需要一个 OpenTelemetry Collector(或 DataDog 这类现成端点)。
- 依赖:OTLP 路线需要可选依赖
pip install 'hermes-agent[otlp]',其余路线零额外依赖。 - 要动的文件:
~/.hermes/config.yaml— 只改这里,加 OTLP 端点配置~/.hermes/logs/— Logstash 要读这里,确保权限对~/.hermes/sessions/— 会话 JSON,想一起入库时再管
多 profile 用户注意:每个 profile 有独立的 home(~/.hermes/profiles/<name>/),路径都跟着 profile 走。
第一步:确认本地日志在产出
Hermes Agent 的日志分两路写:agent.log收 INFO 及以上的运行信息,errors.log只收 WARNING 以上的告警。先确认它们在滚动:
tail -f ~/.hermes/logs/errors.log触发一次报错(比如临时把模型 API key 填错),几秒内应看到一行 WARNING。没有输出就去~/.hermes/config.yaml看日志级别,或确认你操作的是不是当前 profile 的 home 目录。
第二步:脱敏是内置的,不用你写 🔧
往外送数据之前,Hermes Agent 会强制过一次脱敏(源码在 agent/monitoring/redaction.py)。它没有开关,也不留"弱化模式":Bearer 令牌、sk-/ghp_这类 token、邮箱、手机号、UUID 全部会被改写成[redacted]、[email]、[id]。更关键的是 fail-closed——脱敏器一旦跑不起来,原始字符串直接不发出。
你可以亲手验证一下这条链路:
python -c "from agent.monitoring.redaction import redact_for_export; print(redact_for_export('key sk-abcdef1234567890 mail a@b.com'))"预期输出是key [redacted] mail [email]。看到明文原样打印,说明你 import 错了模块,检查agent/monitoring/是否在包里。
第三步:把数据送进 ELK
路线 A:OTLP 上报(项目原生通道)
Hermes Agent 的监控面天生就是 OTLP 出口(实现见 agent/monitoring/otlp_exporter.py),网关健康状态和脱敏后的诊断事件会以 span 形式推给你的 Collector。在~/.hermes/config.yaml里加:
monitoring: export: otlp: endpoint: "http://127.0.0.1:4318/v1/traces" headers_env: Authorization: "OTLP_API_KEY" # 填环境变量名,不是密钥本身注意headers_env存的是环境变量的名字,值在发送时才从环境里取,落盘的配置里永远没有明文密钥。装好可选依赖后重启 gateway,用curl -s http://127.0.0.1:4318确认 Collector 可达,再去 Kibana 里搜service.name含 hermes 的 span 验证链路通了。
路线 B:Logstash 直接读日志文件
如果就想分析agent.log全文,让 Logstash 当文件监视器更直接。配置文件logstash-hermes.conf只需要这么短:
input { file { path => "/HOME/.hermes/logs/agent.log" sincedb_path => "/dev/null" } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "hermes-logs-%{+YYYY.MM.dd}" } }ES 和 Kibana 用单节点 docker 拉起来即可(discovery.type=single-node、--link到 ES 容器)。验证:curl -s localhost:9200/hermes-logs-*/_count,count 应该大于 0。
进阶:让异常自己报出来
选做。在~/.hermes/cron/里加一个每 5 分钟跑一次的任务,用滑动窗口对比错误量:
recent=$(tail -n 200 ~/.hermes/logs/errors.log | wc -l) [ "$recent" -gt 50 ] && curl -X POST "$HERMES_ALERT_WEBHOOK" -d "{\"err\":$recent}"阈值 50 先用一周真实数据校准,再让告警走 gateway 的 delivery 通道发到你自己的 IM。这个玩法不需要额外模型,但对"某次部署后错误翻倍"这类问题足够敏感。
选做:性能与安全加固
- 索引侧:日切索引之外,给 ES 配 ILM 策略,14 天转冷、30 天删除,防止磁盘吃满。
- 访问侧:Kibana 开角色管理,日志只读账号和 admin 分开。
- 标识侧:导出信号里带了一个伪匿名的
monitoring.install_id,多实例部署时用它区分实例;想换身份就hermes config set monitoring.install_id "",下次启动重新生成。 - 传输侧:OTLP 端点尽量走内网或 TLS,
headers_env引用的环境变量只放在~/.hermes/.env里。
常见坑 ⚠️
- 症状:Kibana 一条数据都没有。→原因:Logstash 容器读不到
~/.hermes/logs/。→处理:挂载卷并确认容器用户有读权限,docker logs <logstash>看有没有 permission denied。 - 症状:配置了 OTLP 但 gateway 日志报
OTLP export requires the optional dependency。→原因:可选依赖没装。→处理:pip install 'hermes-agent[otlp]'后重启 gateway。 - 症状:导出数据里居然有明文邮箱或 token。→原因:你看的不是 OTLP 通道,而是本地原始日志——监控面导出必过脱敏,本地文件不做脱敏。→处理:本地日志只留本机,别直接拷进共享存储。
- 症状:多个 profile 的日志混在同一个索引里分不清。→原因:Logstash 只挂了一个路径。→处理:为每个 profile 的
~/.hermes/profiles/<name>/logs/加 input 分支,索引名带上 profile。 - 症状:
agent.log涨得飞快,磁盘告警。→原因:没有轮转,Logstash 又全量吸走。→处理:给本地日志加 logrotate(weekly、rotate 4),ES 侧用 ILM 兜底。
链路通了之后,下一步建议看一眼 agent/monitoring/ 里的事件定义,了解每类 span 携带哪些字段;项目约定和目录说明在 AGENTS.md,按图索骥很快能上手。
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考