之前已搭建一个ELK+Filebeat 的集群,并收集了 Nginx 的日志信息。在 Elasticsearch 中索引的名字是:nginx-access-log-*,后面的*代表的是日期。
假如,需要删除7天前的数据,可以执行通过以下方法:
curl -u elastic:****** -H'Content-Type: application/json' -d'{
"query": {
"range": {
"@timestamp": {
"lt": "now-4d",
"format": "epoch_millis"
}
}
}
}
' -XPOST "http://192.168.1.231:9200/nginx-access-log*/_delete_by_query?pretty"
其中:
-u
是格式为username:password
,使用Basic Auth
进行登录。如果 Elasticsearch 没有使用x-pack
进行安全认证登录,则不需要加这个参数。-H
设置请求头,'Content-Type: application/json'
文档类型是json格式。-XPOST
是指定用 POST 方式请求-d
是指定发送的 body 内容- body 内容解释如下:
{
"query": {
"range": { // 范围
"@timestamp": { // 时间段
"lt": "now-4d", // lt是小于(<),lte是小于等于(<=),gt是大于(>),gte是大于等于(>=),now-7d是当前时间减7天
"format": "epoch_millis"
}
}
}
}
执行语句会返回一些信息:
{
"took" : 8822,
"timed_out" : false,
"total" : 160821,
"deleted" : 160821,
"batches" : 161,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
ElasticSearch 选择返回如此详细的信息是为了让执行者知晓本次删除操作的概况,从返回结果中我们可以得知总共有多少被删除的数据、实际上删除了多少、耗时多久、是否超时等。
以上方法只会删除数据,不会删除索引文件。如果想删除索引文件,可以使用以下脚本方式进行定时删除:
#!/bin/bash
#es_index_delete.sh
USERNAME=elastic
PASSWORD=*****
LAST_DATA=`date -d "-7 days" "+%Y.%m.%d"`
curl -XDELETE http://${USERNAME}:${PASSWORD}@192.168.1.231:9200/nginx-access-log-${LAST_DATA}
-7 days
指定7天前的索引时间%Y.%m.%d
指定时间的格式curl -XDELETE http://ip:port/nginx-access-log-${LAST_DATA}
删除索引的命令,ip是索引集群地址,port是索引集群端口,nginx-access-log-${LAST_DATA} 表示删除以nginx-access-log-
名字为开头的文件,比如nginx-access-log-2022.05.25