logstash的日志循环脚本,用于清除两周前的日志

rvpgvaaj  于 2022-12-09  发布在  Logstash
关注(0)|答案(6)|浏览(171)

我正在尝试想出最好的方法来清除logstash服务器上超过两周的日志。
对于那些不知道的人,Logstash将它的日志存储在Elasticsearch中。我工作的地方有一个非常稳定的ELK堆栈(Elasticsearch/Logstash/Kibana)。
删除logstash索引的典型方法是使用curl命令,如下所示:

#curl --user admin -XDELETE http://localhost:9200/logstash-2015.06.06
Enter host password for user 'admin':
{"acknowledged":true}

现在,我正在寻找一种编程方式来更改logstash索引中的日期,以自动清除任何超过两周的索引。
我在考虑使用bash来完成此操作。
我会感激任何如何做到这一点的例子或建议,你可能有!
谢谢
谢谢!!但是你认为你可以帮助我得到这个使用auth?
这是我目前所尝试的:

[root@logs:~] #curator --help | grep -i auth
  --http_auth TEXT   Use Basic Authentication ex: user:pass
[root@logs:~] #curator delete indices --older-than 14 --time-unit days --timestring %Y.%m.%d --regex '^logstash-' --http_auth admin:secretsauce
Error: no such option: --http_auth
[root@logs:~] #curator delete indices --older-than 14 --time-unit days --timestring %Y.%m.%d --regex '^logstash-' --http_auth admin:secretsauce
Error: no such option: --http_auth
[root@logs:~] #curator delete indices --http_auth admin:secretsauce --older-than 14 --time-unit days --timestring %Y.%m.%d --regex '^logstash-'
Error: no such option: --http_auth
rsl1atfo

rsl1atfo1#

使用Curator。要删除14天之前的索引,可以运行以下命令:

curator delete indices --older-than 14 --time-unit days --timestring %Y.%m.%d --regex '^logstash-'
uxh89sit

uxh89sit2#

如果出于某种原因curator不适合您,您可以运行以下bash脚本:

#!/bin/bash

: ${2?"Usage: $0 [number of days] [base url of elastic]"}

days=${1}
baseURL=${2}

curl "${baseURL}/_cat/indices?v&h=i" | grep logstash | sort --key=1 | awk -v n=${days} '{if(NR>n) print a[NR%n]; a[NR%n]=$0}' | awk -v baseURL="$baseURL" '{printf "curl -XDELETE '\''%s/%s'\''\n", baseURL, $1}' | while read x ; do eval $x ; done
gzjq41n4

gzjq41n43#

online documentation for Curator解释了其中的许多细节。URL在--help输出的顶部很方便地提供:

$ curator --help
Usage: curator [OPTIONS] COMMAND [ARGS]...

  Curator for Elasticsearch indices.

  See http://elastic.co/guide/en/elasticsearch/client/curator/current

There's an entire sub-section on flags。在documentation for the --http_auth标志中,它表示:
此标志必须出现在任何命令之前。

lvjbypge

lvjbypge4#

在ElasticSearch/OpenSearch的较新版本(7.x+)上,更好的方法是使用状态管理策略,您可以在这里阅读更多信息https://aws.amazon.com/blogs/big-data/automating-index-state-management-for-amazon-opensearch-service-successor-to-amazon-elasticsearch-service/
下面是如何使用它来删除旧索引:

{
    "policy": {
        "description": "Removes old indexes",
        "default_state": "active",
        "states": [
            {
                "name": "active",
                "transitions": [
                    {
                        "state_name": "delete",
                        "conditions": {
                            "min_index_age": "14d"
                        }
                    }
                ]
            },
            {
                "name": "delete",
                "actions": [
                    {
                        "delete": {}
                    }
                ],
                "transitions": []
            }
        ],
        "ism_template": {
            "index_patterns": [
                "mylogs-*"
            ]
        }
    }
}

它会自动将策略应用于任何新的mylogs-*索引,但您需要手动将其应用于现有索引(在"Index Management"-〉"Indices"下)。

px9o7tmv

px9o7tmv5#

ElasticSearch X-Pack允许您设置一个策略,根据时间自动删除索引。这是一个相当复杂的解决方案,而且需要付费:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-lifecycle-management.html
馆长似乎维护得很好,支持最近版本的ElasticSearch,做你想做的事情。
或者,这里有一个BASH脚本。但是,它在BSD或Mac上不起作用,因为我使用的是非POSIX date -ud
我每天都使用systemd来运行这个程序。

#!/usr/bin/env bash 

    elasticsearchURL="http://localhost:9200"
    date_format="%Y.%m.%d"
    today_seconds=$(date +"%s")
    let seconds_per_day=24*60*60
    let delay_seconds=$seconds_per_day*7
    let cutoff_seconds=$today_seconds-$delay_seconds
    cutoff_date=$(date -ud "@$cutoff_seconds" +"$date_format")
    indices=$(curl -XGET "${elasticsearchURL}/_cat/indices" | cut -d ' ' -f 3 | grep -P "\d{4}\.\d{2}\.\d{2}")

    echo "Deleting indexes created before the cutoff date $cutoff_date."

    for index in $indices; do
        index_date=$(echo "$index" | grep -P --only-matching "\d{4}\.\d{2}\.\d{2}")
        if [[ $index_date < $cutoff_date ]]; then
            echo "Deleting old index $index"
            curl -XDELETE "${elasticsearchURL}/$index"
            echo ""
        fi
    done
8gsdolmq

8gsdolmq6#

为此,有一个特殊的实用程序"Curator" from Elastic。它必须安装为specified in the documentation
然后,您需要在the configuration File中的“hosts”参数中写入ElasticSerach服务器的地址。在Windows上,此文件应位于用户文件夹中,例如:c:\用户\您的用户名.管理员\管理员.yml
然后,您需要通过documentation创建一个带有操作“curatorRotateLogs.yml”的文件,例如:

---
# Remember, leave a key empty if there is no value.  None will be a string,
# not a Python "NoneType"
actions:
  1:
    action: delete_indices
    description: >-
      Delete indices older than 45 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
      disable_action: False
    filters:
    - filtertype: pattern
      kind: prefix
      value: logstash-
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 14

然后运行调度程序:“C:\程序文件\ElasticSearch管理员\管理员. exe”

相关问题