刪除 Elasticsearch 中指定日期前的數據

之前已搭建一個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

      原文鏈接地址:https://www.seafog.cn/archives/318925258

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章