Elasticsearch日志分析Skill elasticsearch-analysis

该技能用于通过Elasticsearch或OpenSearch进行日志分析,利用Lucene查询语法和Query DSL快速定位和解决问题,适用于ELK栈等日志管理系统,提升运维效率和故障排查能力。关键词:Elasticsearch、日志分析、Lucene、Query DSL、ELK栈、OpenSearch、DevOps、监控、错误调查。

DevOps 0 次安装 0 次浏览 更新于 3/15/2026

名称:elasticsearch-analysis 描述:使用Lucene查询语法和Query DSL进行Elasticsearch/OpenSearch日志分析。在通过ELK栈、OpenSearch或任何基于Elasticsearch的日志系统调查问题时使用。 允许工具:Bash(python *)

Elasticsearch分析

认证

重要:凭据由代理层自动注入。请勿检查环境变量中的ELASTICSEARCH_URLES_USERES_PASSWORD——它们对您不可见。直接运行脚本即可;认证已透明处理。


强制要求:统计优先调查

切勿转储原始日志。 始终遵循此模式:

统计 → 采样 → 模式 → 关联
  1. 统计优先 - 在采样前了解日志量、错误率和顶级模式
  2. 战略采样 - 基于统计选择正确的策略
  3. 模式提取 - 聚类相似错误以找到根本原因
  4. 上下文关联 - 围绕异常时间戳进行调查

可用脚本

所有脚本位于.claude/skills/observability-elasticsearch/scripts/

主要调查脚本

get_statistics.py - 始终从这里开始

综合统计与模式提取。

python .claude/skills/observability-elasticsearch/scripts/get_statistics.py [--index 索引] [--time-range 分钟]

# 示例:
python .claude/skills/observability-elasticsearch/scripts/get_statistics.py --time-range 60
python .claude/skills/observability-elasticsearch/scripts/get_statistics.py --index logs-production

输出包括:

  • 总计数、错误计数、错误率百分比
  • 状态分布(信息、警告、错误)
  • 按日志量排名的顶级服务/来源
  • 顶级错误模式(快速分类的关键)
  • 可操作建议

sample_logs.py - 战略采样

基于统计选择正确的采样策略。

python .claude/skills/observability-elasticsearch/scripts/sample_logs.py --strategy 策略 [--index 索引] [--limit N]

# 策略:
#   errors_only   - 仅错误日志(默认用于事件)
#   warnings_up   - 警告和错误日志
#   around_time   - 围绕特定时间戳的日志
#   all           - 所有日志级别

# 示例:
python .claude/skills/observability-elasticsearch/scripts/sample_logs.py --strategy errors_only --index logs-production
python .claude/skills/observability-elasticsearch/scripts/sample_logs.py --strategy around_time --timestamp "2026-01-27T05:00:00Z" --window 5

Lucene查询语法

基本搜索

# 简单术语
error

# 短语
"connection refused"

# 字段搜索
level:ERROR

# 通配符
message:timeout*

# 多术语(隐式OR)
error warning

# 必需术语(AND)
+error +timeout

字段查询

# 精确匹配
level:ERROR

# 通配符
host:web-*

# 范围(数字)
status:[400 TO 599]

# 范围(日期)
@timestamp:[2024-01-15T10:00:00 TO 2024-01-15T11:00:00]

# 存在
_exists_:error.stack_trace

布尔运算符

# AND
error AND timeout

# OR
error OR warning

# NOT
error NOT debug

# 分组
(error OR warning) AND service:api

查询DSL(JSON)

匹配查询

{
  "query": {
    "match": {
      "message": "connection error"
    }
  }
}

术语查询(精确匹配)

{
  "query": {
    "term": {
      "level": "ERROR"
    }
  }
}

布尔查询(复合)

{
  "query": {
    "bool": {
      "must": [
        {"term": {"level": "ERROR"}},
        {"match": {"message": "timeout"}}
      ],
      "must_not": [
        {"term": {"service": "healthcheck"}}
      ],
      "filter": [
        {"range": {"@timestamp": {"gte": "now-1h"}}}
      ]
    }
  }
}

聚合

{
  "size": 0,
  "aggs": {
    "errors_by_service": {
      "terms": {
        "field": "service.keyword",
        "size": 10
      }
    }
  }
}

调查工作流程

标准事件调查

┌─────────────────────────────────────────────────────────────┐
│ 1. 统计优先(强制)                                           │
│    python get_statistics.py --index <索引>                    │
│    → 了解日志量、错误率、顶级模式                               │
└─────────────────────────────────────────────────────────────┘
                             │
                             ▼
                     高错误率?
               ┌─────────────┴─────────────┐
               │                           │
       是 (>5%)                          否
               │                           │
               ▼                           ▼
┌─────────────────────────────┐  ┌───────────────────────────────────────────┐
│ 2. 快速路径                  │  │ 2. 目标调查                                │
│    直接采样错误             │  │    按特定标准过滤                          │
│    python sample_logs.py    │  │    python sample_logs.py --strategy all   │
│    --strategy errors_only   │  │    → 查找异常                              │
└─────────────────────────────┘  └───────────────────────────────────────────┘

快速命令参考

目标 命令
开始调查 get_statistics.py --index X
仅采样错误 sample_logs.py --strategy errors_only --index X
调查峰值 sample_logs.py --strategy around_time --timestamp T
所有日志 sample_logs.py --strategy all --index X --limit 20

常见聚合模式

错误随时间变化

{
  "size": 0,
  "query": {"term": {"level": "ERROR"}},
  "aggs": {
    "errors_over_time": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "5m"
      }
    }
  }
}

顶级错误消息

{
  "size": 0,
  "query": {"term": {"level": "ERROR"}},
  "aggs": {
    "top_errors": {
      "terms": {
        "field": "message.keyword",
        "size": 10
      }
    }
  }
}

嵌套聚合(按服务,然后按消息)

{
  "size": 0,
  "aggs": {
    "by_service": {
      "terms": {"field": "service.keyword", "size": 10},
      "aggs": {
        "by_message": {
          "terms": {"field": "message.keyword", "size": 5}
        }
      }
    }
  }
}

字段类型

关键词 vs 文本

  • keyword:精确匹配,可聚合(service.keyword
  • text:全文搜索,不可聚合(message
// 用于聚合,使用.keyword后缀
"terms": {"field": "service.keyword"}

// 用于全文搜索,使用文本字段
"match": {"message": "connection error"}

要避免的反模式

  1. 切勿跳过统计 - get_statistics.py是强制第一步
  2. 无限制查询 - 始终指定时间范围和限制
  3. 获取所有日志 - 使用采样策略,而非无限制搜索
  4. 忽略错误率 - 高错误率需立即调查
  5. 在聚合中使用文本字段 - 使用.keyword后缀进行术语聚合
  6. 通配符前缀 - *error成本高,优先使用error*或精确匹配