Supprimer les anciens indices dans elasticsearch
j'ai la plupart de mes journaux indexés dans le format logstash-Year-Week. C'est-à-dire si je veux supprimer des indices plus vieux que quelques semaines, Comment puis-je atteindre cela dans elasticsearch. Est-il facile, sans couture façon de le faire?
6 réponses
conservateur serait une correspondance idéale ici. Vous pouvez trouver le lien ici - https://github.com/elastic/curator
Une commande comme ci-dessous devrait fonctionner parfaitement -
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 enlever les indices de temps en temps.
Vous pouvez trouver quelques exemples et docs ici - https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html
si vous utilisez elasticsearch version 5.x ensuite, vous devez installer la version 4 du conservateur.x. Vous pouvez voir la compatibilité de la version et les étapes d'installation à partir du documentation
une Fois installé. Ensuite, il suffit d'exécuter la commande
curator --config path/config_file.yml [--dry-run] path/action_file.yml
Le Conservateur fournit un indicateur d'exécution à sec pour juste afficher ce que le conservateur aurait exécuté. La sortie sera dans votre fichier log que vous avez défini dans config.fichier yml. Si l'exploitation forestière clé définie dans config_file.yml alors currator va sortir à la console. Pour supprimer les indices, lancez la commande ci-dessus sans drapeau --dry-run
Le fichier de configuration config_file.yml
---
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
---
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 indices hebdomadaire, mensuel, etc automatiquement. Alors écrivez le script de 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
mettez un script shell dans l'un de ces dossiers: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly
et votre travail est faire.
NOTE: assurez-vous d'utiliser la bonne indentation dans vos fichiers de configuration et d'action. Sinon il ne fonctionnera pas.
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 }' | awk -F'-' '{ print }' | sed 's/\.//g' `
if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
then
TODELETE=`echo $LINE | awk '{ print }'`
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 }' | awk -F'-' '{ print }' | sed 's/\.//g' `
if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
then
TODELETE=`echo $LINE | awk '{ print }'`
/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
regardez Conservateur, un outil développé spécialement pour ce genre de cas d'utilisation.
une commande Exemple, pour la documentation:
curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days \
--timestring '%Y.%m.%d'
yanb (encore un bash)
#!/bin/bash
searchIndex=logstash-monitor
elastic_url=logging.core.k94.kvk.nl
elastic_port=9200
date2stamp () {
date --utc --date "" +%s
}
dateDiff (){
case in
-s) sec=1; shift;;
-m) sec=60; shift;;
-h) sec=3600; shift;;
-d) sec=86400; shift;;
*) sec=86400;;
esac
dte1=$(date2stamp )
dte2=$(date2stamp )
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 }'); 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
curator_cli delete_indices --filter_list '{"filtertype":"none"}'
supprimera tout ou filtrera:
--filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'