Ich habe viele meiner Protokolle im logstash-Year-Week-Format indexiert. Das heißt, wenn ich Indizes löschen möchte, die älter als ein paar Wochen sind, wie kann ich das in der Elasticsearch erreichen? Gibt es eine einfache, nahtlose Möglichkeit, dies zu tun?
Kurator wäre hier ein ideales Gegenstück .. __ Den Link finden Sie hier - https://github.com/elastic/curator
Ein Befehl wie unten sollte gut funktionieren -
curator --Host <IP> delete indices --older-than 30 --prefix "Twitter-" --time-unit days --timestring '%Y-%m-%d'
Sie können dies im CRON beibehalten, um die Indizes gelegentlich zu entfernen.
Einige Beispiele und Dokumente finden Sie hier - https://www.elastic.co/guide/de/elasticsearch/client/curator/current/examples.html
Wenn Sie Elasticsearch Version 5.x verwenden, müssen Sie die Curator-Version 4.x ..__ installieren. Die Versionskompatibilität und Installationsschritte finden Sie in der Dokumentation .
Einmal installiert Dann einfach den Befehl ausführen
curator --config path/config_file.yml [--dry-run] path/action_file.yml
Curator stellt ein Trockenlauf-Flag bereit, um nur das auszugeben, was Curator ausgeführt hätte. Die Ausgabe erfolgt in Ihrer Protokolldatei, die Sie in der Datei config.yml definiert haben. Wenn der in config_file.yml definierte Protokollierungsschlüssel nicht vorhanden ist, wird der Currator an die Konsole ausgegeben. Um die Indizes zu löschen, führen Sie den obigen Befehl ohne die Option --dry-run aus
Die Konfigurationsdatei config_file.yml lautet
---
client:
hosts:
- 127.0.0.1
port: 9200
logging:
loglevel: INFO
logfile: "/root/curator/logs/actions.log"
logformat: default
blacklist: ['elasticsearch', 'urllib3']
Die Aktionsdatei action_file.yml lautet
---
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:
Wenn Sie die Indizes wöchentlich, monatlich usw. automatisch löschen möchten. Dann schreibe einfach das Bash-Skript
#!/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
Legen Sie ein Shell-Skript in einen der folgenden Ordner: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly
und Ihre Aufgabe ist erledigt.
HINWEIS: Stellen Sie sicher, dass Sie in Ihren Konfigurations- und Aktionsdateien den richtigen Einzug verwenden. Sonst funktioniert es nicht.
Ich benutze ein Bash-Skript. Ändere einfach die 30 mit der Anzahl der Tage, die du behalten möchtest
#!/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
Werfen Sie einen Blick auf Curator , ein speziell für diesen Anwendungsfall entwickeltes Werkzeug.
Ein Beispielbefehl für die Dokumentation:
curator --Host 10.0.0.2 delete indices --older-than 30 --time-unit days \
--timestring '%Y.%m.%d'
yanb (noch eine 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
curator_cli delete_indices --filter_list '{"filtertype":"none"}'
wird alles löschen oder filtern:
--filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'