web-dev-qa-db-fra.com

Supprimer les anciens index dans elasticsearch

J'ai mes nombreux journaux indexés au format logstash-Year-Week. Si je veux supprimer des index de plus de quelques semaines, comment puis-je obtenir cela dans elasticsearch Existe-t-il un moyen simple et transparent de le faire?

22
steven johns

Curator serait un match idéal ici . Vous pouvez trouver le lien ici - https://github.com/elastic/curator

Une commande comme ci-dessous devrait bien fonctionner - 

curator --Host <IP> delete indices --older-than 30 --prefix "Twitter-" --time-unit days  --timestring '%Y-%m-%d'

Vous pouvez garder cela dans le CRON pour supprimer les index de temps en temps. 

Vous pouvez trouver quelques exemples et documents ici - https://www.elastic.co/guide/fr/elasticsearch/client/curator/current/examples.html

24
Vineeth Mohan

Si vous utilisez elasticsearch version 5.x, vous devez installer la version 4.x ..__ du conservateur. Vous pouvez voir les étapes de compatibilité et d'installation de la version à partir de documentation

Une fois installé. Ensuite, lancez la commande 

curator --config path/config_file.yml [--dry-run] path/action_file.yml

Curator fournit un indicateur de piste sèche pour indiquer simplement ce que Curator aurait exécuté. La sortie sera dans votre fichier journal que vous avez défini dans le fichier config.yml. Si la clé de journalisation n'est pas définie dans config_file.yml, currator sera envoyé à la console. Pour supprimer les index, exécutez la commande ci-dessus sans l'option --dry-run.

Le fichier de configuration config_file.yml est 

---
client:
  hosts:
   - 127.0.0.1
  port: 9200
logging:
  loglevel: INFO
  logfile: "/root/curator/logs/actions.log"
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

Le fichier d'action action_file.yml est 

---
actions:
  1:
    action: delete_indices
    description: >-
      Delete indices older than 7 days (based on index name), for logstash-
      prefixed indices. Ignore the error if the filter does not result in an
      actionable list of indices (ignore_empty_list) and exit cleanly.
    options:
      ignore_empty_list: True
      timeout_override:
      continue_if_exception: False
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: logstash-
      exclude:
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 7
      exclude:

Si vous souhaitez supprimer les index chaque semaine, chaque mois, etc. automatiquement. Ensuite, écrivez simplement le script bash comme 

#!/bin/bash
# Script to delete the log event indices of the elasticsearch weekly

#This will delete the indices of the last 7 days
curator --config /path/config_file.yml /path/action_file.yml

Placez un script Shell dans l'un des dossiers suivants: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly et votre travail est terminé.

NOTE: Assurez-vous d'utiliser le bon retrait dans vos fichiers de configuration et d'action. Sinon, ça ne marchera pas.

16
Sachchit Bansal

J'utilise un script bash, il suffit de changer le 30 avec le nombre de jours que vous souhaitez conserver

#!/bin/bash

# Zero padded days using %d instead of %e
DAYSAGO=`date --date="30 days ago" +%Y%m%d`
ALLLINES=`/usr/bin/curl -s -XGET http://127.0.0.1:9200/_cat/indices?v | egrep logstash`

echo
echo "THIS IS WHAT SHOULD BE DELETED FOR ELK:"
echo

echo "$ALLLINES" | while read LINE
do
  FORMATEDLINE=`echo $LINE | awk '{ print $3 }' | awk -F'-' '{ print $2 }' | sed 's/\.//g' ` 
  if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
  then
    TODELETE=`echo $LINE | awk '{ print $3 }'`
    echo "http://127.0.0.1:9200/$TODELETE"
  fi
done

echo
echo -n "if this make sence, Y to continue N to exit [Y/N]:"
read INPUT
if [ "$INPUT" == "Y" ] || [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] || [ "$INPUT" == "YES" ]
then
  echo "$ALLLINES" | while read LINE
  do
    FORMATEDLINE=`echo $LINE | awk '{ print $3 }' | awk -F'-' '{ print $2 }' | sed 's/\.//g' `
    if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
    then
      TODELETE=`echo $LINE | awk '{ print $3 }'`
      /usr/bin/curl -XDELETE http://127.0.0.1:9200/$TODELETE
      sleep 1
      fi
  done
else 
  echo SCRIPT CLOSED BY USER, BYE ...
  echo
  exit
fi
12
Alejandro Teijeiro

Jetez un coup d’œil à Curator , un outil développé spécialement pour ce type d’utilisation.

Un exemple de commande, pour la documentation:

curator --Host 10.0.0.2 delete indices --older-than 30 --time-unit days \
   --timestring '%Y.%m.%d'
6
Andrei Stefan

yanb (encore une autre bash)

#!/bin/bash
searchIndex=logstash-monitor
elastic_url=logging.core.k94.kvk.nl
elastic_port=9200

date2stamp () {
    date --utc --date "$1" +%s
}

dateDiff (){
    case $1 in
        -s)   sec=1;      shift;;
        -m)   sec=60;     shift;;
        -h)   sec=3600;   shift;;
        -d)   sec=86400;  shift;;
        *)    sec=86400;;
    esac
    dte1=$(date2stamp $1)
    dte2=$(date2stamp $2)
    diffSec=$((dte2-dte1))
    if ((diffSec < 0)); then abs=-1; else abs=1; fi
    echo $((diffSec/sec*abs))
}

for index in $(curl -s "${elastic_url}:${elastic_port}/_cat/indices?v" |     grep -E " ${searchIndex}-20[0-9][0-9]\.[0-1][0-9]\.[0-3][0-9]" | awk '{     print $3 }'); do
  date=$(echo ${index: -10} | sed 's/\./-/g')
  cond=$(date +%Y-%m-%d)
  diff=$(dateDiff -d $date $cond)
  echo -n "${index} (${diff})"
  if [ $diff -gt 1 ]; then
    echo " / DELETE"
    # curl -XDELETE "${elastic_url}:${elastic_port}/${index}?pretty"
  else
    echo ""
  fi
done    
0
Bob
curator_cli delete_indices --filter_list '{"filtertype":"none"}' 

va supprimer tout ou filtrer:

 --filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'
0
Vlad Cenan