如何像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
相关产品推荐
相关产品推荐

