2015-10-30 21 views
16

Tôi có nhiều nhật ký của mình được lập chỉ mục theo định dạng logstash-Year-Week. Đó là nếu tôi muốn xóa các chỉ mục cũ hơn một vài tuần, làm thế nào tôi có thể đạt được điều đó trong elasticsearch. Có cách nào dễ dàng, liền mạch để làm điều đó không?Xóa các chỉ mục cũ trong elasticsearch

Trả lời

19

Phụ trách sẽ là một kết hợp lý tưởng ở đây. Bạn có thể tìm thấy liên kết ở đây - https://github.com/elastic/curator

Một lệnh như dưới đây sẽ chỉ làm việc tốt -

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

Bạn có thể giữ này trong CRON để loại bỏ các chỉ số thỉnh thoảng.

Bạn có thể tìm thấy một số ví dụ và tài liệu ở đây - https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html

+0

Đây là những gì tôi đang tìm kiếm. Bạn có tài liệu về các ứng dụng của người phụ trách? –

+4

Điều này KHÔNG làm việc với người phụ trách v4 hoặc mới hơn. Nó đòi hỏi một tập tin cấu hình và một tập tin hành động, nơi hành động của người phụ trách được mô tả. –

+0

Xem câu trả lời bằng @ sachchit-bansal cho người phụ trách làm việc 4.2 ví dụ – chrisan

6

Hãy xem Curator, một công cụ được phát triển đặc biệt cho loại trường hợp sử dụng này.

Một lệnh mẫu, cho các tài liệu:

curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days \ 
    --timestring '%Y.%m.%d' 
10

tôi sử dụng một kịch bản bash, chỉ cần thay đổi 30 với # ngày bạn muốn giữ

#!/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 
0

yanb (chưa bash khác)

#!/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  
13

Nếu bạn đang sử dụng phiên bản elasticsearch 5.x thì bạn cần cài đặt phiên bản curator 4.x. Bạn có thể xem các bước cài đặt tương thích và cài đặt phiên bản từ documentation

Sau khi cài đặt. Sau đó, chỉ cần chạy lệnh

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

Trình quản lý cung cấp cờ chạy khô để chỉ xuất ra những gì Trình quản lý sẽ thực hiện. Đầu ra sẽ nằm trong tệp nhật ký mà bạn đã xác định trong tệp config.yml. Nếu không đăng nhập khóa được định nghĩa trong config_file.yml thì currator sẽ xuất ra console. Để xóa các chỉ số chạy lệnh trên mà không --dry chạy cờ

Các config_file.yml tập tin cấu hình là

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

Các action_file.yml tập tin action là

--- 
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: 

Nếu bạn muốn để xóa các chỉ mục hàng tuần, hàng tháng, v.v. Sau đó, chỉ cần viết tập lệnh bash như

#!/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 

Đặt tập lệnh shell vào một trong các thư mục sau: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly và công việc của bạn đã xong.

LƯU Ý: Đảm bảo sử dụng đúng thụt đầu dòng trong các tệp cấu hình và tác vụ của bạn. Nếu không nó sẽ không hoạt động.

+1

Cảm ơn, đây là phiên bản hiện tại (2017) của câu trả lời này cho người quản lý 4.2 :) – chrisan

+0

Đó là cách người phụ trách làm việc! Câu trả lời của [Vineeth Mohan] (https://stackoverflow.com/users/976646/vineeth-mohan) đã lỗi thời từ người quản lý 4.x trên - và điều đó sẽ áp dụng cho hầu hết các cài đặt elasticsearch ngay bây giờ (trong đó 5.x là hiện tại). – jonashackt

0
curator_cli delete_indices --filter_list '{"filtertype":"none"}' 

sẽ xóa toàn bộ hoặc một bộ lọc:

--filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]' 
Các vấn đề liên quan