You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像API网关一样记录Elasticsearch的POST/PUT/DELETE请求?

记录Elasticsearch所有POST/PUT/DELETE请求的解决方案

首先说明你用slowlog无效的原因:slowlog仅记录超过阈值的慢索引/查询操作,并非全量写请求日志,所以空文件是正常现象。以下是几种可行的实现方式:

1. 启用Elasticsearch内置审计日志(推荐)

这是官方自带的功能,无需额外插件,可直接记录所有写操作:

  • 修改elasticsearch.yml添加审计配置:
    xpack.security.audit.enabled: true
    xpack.security.audit.logfile.events.include: "write,delete"
    xpack.security.audit.logfile.events.exclude: "grant_api_key,authenticate"
    xpack.security.audit.logfile.emit_request_body: true # 可选,开启后会记录请求体内容
    
  • 重启Elasticsearch后,审计日志默认输出到logs/elasticsearch_audit.log,包含请求类型、客户端IP、目标索引、请求体(若开启)等关键信息。

2. 用Logstash作为前置代理

将所有请求先发送到Logstash,由Logstash转发至Elasticsearch,同时记录全量写请求:

  • 配置Logstash的http输入监听端口(比如和ES一致的9200):
    input {
      http {
        port => 9200
        ssl => false # 若ES启用HTTPS,需同步配置SSL参数
      }
    }
    
  • 添加过滤规则提取请求关键信息:
    filter {
      mutate {
        add_field => {
          "request_method" => "%{[@metadata][http_request_method]}"
          "request_path" => "%{[@metadata][http_request_path]}"
        }
      }
      # 仅保留POST/PUT/DELETE请求的日志
      if ![request_method] in ["POST", "PUT", "DELETE"] {
        drop {}
      }
    }
    
  • 配置输出,同时转发请求到ES并记录日志:
    output {
      # 转发到实际的Elasticsearch集群
      elasticsearch {
        hosts => ["http://your-es-node:9200"]
        # 保持原请求的索引路径
        index => "%{split([@metadata][http_request_path], '/')[1]}"
      }
      # 将请求日志写入文件
      file {
        path => "/var/log/logstash/es_write_requests.log"
        codec => line { format => "%{@timestamp} | %{request_method} | %{request_path} | %{message}"}
      }
    }
    
  • 客户端将请求发送至Logstash的9200端口即可实现转发+日志记录。

3. 采集ES HTTP访问日志

开启Elasticsearch的HTTP访问日志,再用Filebeat采集并过滤:

  • 修改elasticsearch.yml开启HTTP访问日志:
    http.log.enabled: true
    http.log.file.path: logs/http_access.log
    
  • 重启ES后,http_access.log会记录所有HTTP请求的方法、路径、状态码等信息。
  • 配置Filebeat采集并过滤出写请求:
    filebeat.inputs:
    - type: log
      paths:
        - /path/to/elasticsearch/logs/http_access.log
      # 过滤掉GET请求,仅保留写操作
      exclude_lines: ['^GET']
      fields:
        log_type: es_http_access
    # 可选择将日志发送到Logstash处理或直接存入ES
    output.logstash:
      hosts: ["your-logstash-node:5044"]
    

内容的提问来源于stack exchange,提问作者Akhilendra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:03:32