Skill: hgvgfgvh/server-log-analysis (version 1.0.0)

--- name: server-log-analysis description: 通过 SSH 连接远程服务器，读取同级 config.yaml 理解服务信息与日志位置，按需下载相关日志片段到本地 temp 目录，并分析日志定位问题。适用于用户要求排查远程服务日志、分析服务端异常或基于 SSH 访问进行日志诊断的场景。 --- # 服务器日志分析 ## 目的 当日志保存在远程服务器上时，使用此 Skill 进行服务问题排查。 本 Skill 默认满足以下前提： - agent 可以通过 SSH 或等价的远程执行工具连接服务器 - 本 Skill 目录下的 `config.yaml` 已定义服务信息、日志路径和业务背景 - 详细分析前，应先按需将日志片段复制到本地 `temp/` 目录 ## 必读文件 - 先读取 `config.yaml` - 需要字段说明或命令模式时，再读取 `reference.md` ## 核心流程 1. 读取 `config.yaml` 2. 将用户问题匹配到一个或多个已配置服务 3. 确定最小必要排查范围： - 目标服务 - 目标主机 - 相关时间窗口 - 可能涉及的日志文件 4. 通过 SSH 或可用远程工具连接目标服务器 5. 下载前先做远程检查： - 文件是否存在、文件大小 - 最近修改时间 - 是否仅靠关键词过滤或 tail 即可满足分析 6. 只下载最小必要日志片段到配置中的本地 `temp/` 目录 7. 在本地副本上分析错误、时间关联、重复故障和可能根因 8. 输出简洁的诊断结论、证据、不确定性和后续建议 ## 排查规则 - 优先使用 `config.yaml` 中的服务定义和业务说明，不要凭空猜测 - 优先在远端过滤，再考虑整文件下载： - 先缩小时间窗口 - 再按关键词筛选 - 最近故障优先使用 tail - 只有在片段不足以判断时才下载完整日志 - 本地保存的日志文件名要清晰体现服务、主机和时间范围 - 除非用户明确要求，否则不要拉取敏感文件、二进制文件或无关的大型归档 - 如果问题跨多个服务，先分析主服务，再扩展到相关依赖服务 ## 服务选择 当用户请求不明确时： 1. 使用 `config.yaml` 中的服务 `aliases`、`keywords` 和 `description` 2. 优先选择语义匹配度最高的服务 3. 仍不明确时，先询问用户要排查哪个服务，再进行远程连接 ## 远程检查清单 下载日志前，先确认： - 主机配置是否与目标服务匹配 - 配置中的日志文件是否存在 - 哪个日志文件最近有更新 - 是否存在需要关注的滚动日志 - 本次问题是近期故障还是历史问题 常见远程检查方式包括： - 文件元信息检查 - 查看最近日志尾部 - 快速关键词搜索 - 按时间窗口提取日志 - 必要时查看进程或服务状态 ## 本地下载规则 下载后的日志统一保存在配置中的 `local_temp_dir` 下。 推荐命名格式： `<service>__<host>__<log_name>__<time_hint>.log` 优先级顺序如下： 1. 最近日志尾部 2. 关键词过滤片段 3. 指定时间窗口片段 4. 完整文件，作为最后手段 ## 分析重点 重点关注： - 启动失败 - 重复异常 - 超时和连接类问题 - 资源压力指标 - 数据库、缓存、消息队列、DNS、HTTP 上游等依赖故障 - 堆栈或启动日志暴露的配置错误 - 关联服务之间的时间戳对齐情况 回答结构应包含： - 问题摘要 - 关键证据 - 初步原因 - 置信度 - 下一步验证建议 ## 安全约束 - 将 `config.yaml` 视为运维元数据，不要把明文敏感信息放进去 - SSH 凭据优先使用环境变量、密钥文件或外部密钥管理方案 - 未经用户明确要求，不要修改远端文件，也不要重启服务 - 未经用户要求，不要自动删除已下载日志 ## 异常处理 如果远程访问失败： 1. 明确说明失败发生在哪一步 2. 说明目标主机和目标服务 3. 请求用户提供正确的 SSH 访问方式、网络路径或凭据 如果配置的日志路径不存在： 1. 明确指出缺失的路径 2. 检查同一服务是否配置了可替代路径 3. 询问用户部署路径是否发生变化 ## 快速执行顺序 每次都按下面顺序执行： 1. 读取 `config.yaml` 2. 识别服务和主机 3. 远程检查日志文件 4. 将最小必要日志复制到 `temp/` 5. 在本地分析 6. 汇总结论并给出证据

path: config.yaml
content: version: 1

analysis:
  local_temp_dir: temp/server-log-analysis
  default_time_window: 2h
  default_tail_lines: 3000
  max_download_mb_per_file: 50
  prefer_remote_filter: true
  preserve_downloads: true

connections:
  default-server:
    host: hostname
    port: 22
    username: root
    [REDACTED_SECRET]

services:
  example-service:
    description: >
      示例业务服务。请替换为清晰的业务说明，包括服务职责、主要上下游依赖，
      以及哪些用户侧故障通常意味着需要优先检查该服务。
    aliases:
      - example
      - demo-service
    keywords:
      - login
      - timeout
      - order
    connection: default-server
    workdir: /opt/example-service
    startup_command: systemctl status example-service
    investigation_hints:
      - 优先检查启动失败类问题。
      - 将超时报错与上游网关日志进行关联分析。
      - 高峰期重点关注数据库连接耗尽问题。
    log_files:
      - name: a
        path: /logs/ms_log/a/
        format: plain
        priority: high
        purpose: 设备直接接入的微服务的日志
download_profiles:
  recent-tail:
    description: 快速抓取最近日志
    mode: tail
    lines: 3000
  recent-errors:
    description: 面向快速诊断的关键词日志片段
    mode: keyword
    keywords:
      - ERROR
      - WARN
      - Exception
      - timeout
      - refused
      - failed
  bounded-window:
    description: 围绕问题时间点提取日志窗口
    mode: time-range
    before: 15m
    after: 15m


path: reference.md
content: # 参考说明

## 配置设计

`config.yaml` 是这个 Skill 的运维配置总表。

建议在其中维护：

- 连接目标
- 服务说明
- 日志文件路径
- 相关配置文件
- 排查提示
- 默认下载策略

不要放入：

- 明文密码
- 私钥
- 一次性事故说明这类应写入单独报告的信息

## 字段说明

### `analysis`

- `local_temp_dir`：下载日志片段的本地目录
- `default_time_window`：用户未提供时间范围时的默认时间窗口
- `default_tail_lines`：默认抓取的最近日志行数
- `max_download_mb_per_file`：单文件下载大小的软限制
- `prefer_remote_filter`：是否优先在远端先过滤再下载
- `preserve_downloads`：分析完成后是否保留本地文件

### `connections`

每个连接项代表一个 SSH 目标或访问入口。

推荐字段：

- `host`
- `port`
- `username`
- `auth.method`
- `auth.password_env` or key reference
- `notes`

如果需要跳板机，可扩展如下字段：

- `jump_host`
- `jump_port`
- `jump_username`

### `services`

每个服务都应尽量写到无需额外口口相传信息也能理解。

推荐字段：

- `description`
- `aliases`
- `keywords`
- `connection`
- `workdir`
- `startup_command`
- `investigation_hints`
- `log_files`
- `related_files`
- `related_services`

### `log_files`

每个日志项不仅要写路径，还要写明用途。

推荐字段：

- `name`
- `path`
- `format`
- `priority`
- `purpose`

## 推荐远程排查流程

1. 将问题匹配到 `config.yaml` 中的服务
2. 确认连接目标
3. 检查文件是否存在、文件大小是否合理
4. 先在远端查看最近 tail 或关键词匹配结果
5. 下载最小必要日志片段
6. 在本地进行分析
7. 证据不足时再扩大范围

## 推荐下载策略

按以下顺序逐步扩大范围：

1. 先取最高优先级日志的最近若干行
2. 再抽取问题关键词附近片段
3. 再拉取指定时间窗口日志
4. 如果问题更早开始，补充滚动日志
5. 只有必要时才下载完整文件

## 服务说明示例

`提供用户登录、令牌刷新和会话校验能力。常见问题包括 Redis 会话失败、下游认证超时和启动配置错误。`

## 排查提示示例

- `登录失败时，联动检查 gateway 与 auth-service 日志。`
- `如果部署后启动失败，检查 application-prod.yml 和 systemd 环境变量。`
- `如果响应时间突然升高，将应用超时日志与数据库连接耗尽进行关联分析。`

## Output Template

Use a concise structure:

```markdown
## 问题摘要
[一句话描述]

## 关键证据
- [日志证据 1]
- [日志证据 2]

## 初步判断
[最可能原因]

## 置信度
[高/中/低]

## 建议下一步
- [建议 1]
- [建议 2]
```

## 备注

- 服务名、别名和对外描述尽量保持术语一致
- 回复中优先使用统一的服务标准名称
- 当日志路径或部署拓扑发生变化时，要及时更新 `config.yaml`


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)