elk爲常見的日誌分析平臺,在很多公司都用使用,但是日誌數據是一個不斷海量增加的東西,如果沒有太大的存儲來存儲這些日誌歷史數據,就會需要刪除時間過長的歷史數據,以保證數據量可控。還不知道elk的,可以參考我另外的elk安裝博文:
《Centos7.2 搭建ELK-5.6.4日誌分析平臺(一)》
《Centos7.2 搭建ELK-5.6.4日誌分析平臺(二)》
《centos7 Supervisor的安裝與配置,管理elk進程。》
elk中elasticsearch爲搜索引擎,也是數據的儲存單元。要想實現只保留固定時間的數據,這裏以7天爲例,要想每個索引的數據都只保留最近7天的數據,大於7天的則刪除,有兩種方法:
1. 看你的索引是怎麼樣的,如果你的索引名稱中有時間,比如logstash-2019-01-02 這樣,就是每天都會生成一個新的索引,這樣的話可以使用官方的Curator 工具
2. 如果你的索引中不帶時間,比如,如果是根據應用或者服務名來命名的,那麼注意,Curator是無法實現刪除索中的某一段數據的!!這裏需要特別注意,網上很多說可以實現的,那是因爲他們的索引如上面1 所說,是根據時間日期來生成的。但實際上,很多索引都不是這樣的,按正常的思維,更容易用服務名或應用名作爲索引,以此來區分日誌所屬應用,方便日誌的分析對應指定的應用。這種時候需要使用elasticsearch的api:delete_by_query來進行刪除指定數據。這種方法也是通用的,更推薦用這種方法
這裏兩種方法都詳細說明。
一 使用API
刪除指定的數據,需要使用到delete_by_query接口,這裏需要科普一下,在elk中,每一條日誌數據就是一個doc文檔,如下:每條數據都會有一個_index,_type,_id 分別就是索引,類型,id。
delete_by_query的接口格式如下:
請求方式爲:post
url爲: http://elasticsearch-host:9200/{index}/_delete_by_query?conflicts=proceed
需要傳參數,通過參數執行選擇的數據,傳參格式爲json。
下面以刪除所有索引,超過7天的歷史數據爲例,用python寫成的腳本如下,可以直接拿去用
import requests
import json
es_host = '127.0.0。1' # Elasticsearch訪問地址
headers = {
'Content-Type': 'application/json'
}
# 這裏url中,用*匹配所有的索引,也可以寫成logstash-* 匹配所有以logstash-開頭的索引等等。
url = 'http://{}:9200/*/_delete_by_query?conflicts=proceed'.format(es_host)
data = {
"query": {
"range": {
"@timestamp": { # 這裏我根據默認的時間來作爲查詢的時間字段,也可以是自定義的
"lt": "now-7d", # 這裏是7天,時間可自定義
"format": "epoch_millis"
}
}
}
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
# 刪除後,需要執行forcemerge操作,手動釋放磁盤空間
url2 ='http://{}:9200/_forcemerge?only_expunge_deletes=true&max_num_segments=1'.format(es_host)
response = requests.post(url2)
print(response.json())
以上,就是一個完整的刪除索引的歷史數據的一個腳本,然後只需要將此腳本添加到crontab中,每天定時執行以此就可以實現只保留固定時間的數據了。怎麼添加到crontab就不贅述了,不懂的參考我另一篇博文《centos7.2 利用crontab執行定時計劃任務》
二 Elasticsearch Curator
簡介
curator 是一個官方的,可以管理elasticsearch索引的工具,可以實現創建,刪除,段合併等等操作。詳見官方文檔
版本
安裝
安裝非常簡單,直接通過pip安裝即可。 其他安裝方案,詳見官方文檔:安裝
pip install elasticsearch-curator
使用
安裝後,便可以在命令行中直接使用,使用--help查看一下使用方法
curator --help
Usage: curator [OPTIONS] ACTION_FILE
Curator for Elasticsearch indices.
See http://elastic.co/guide/en/elasticsearch/client/curator/current
Options:
--config PATH Path to configuration file. Default: ~/.curator/curator.yml
--dry-run Do not perform any changes.
--version Show the version and exit.
--help Show this message and exit.
看到使用需要定義兩個文件,一個配置文件 curator,.yml 和 操作文件 action.yml
配置文件 curator.yml 示例如下: 詳細的配置文件配置方法,詳見官方文檔: 配置文件curator.yml
client:
hosts:
- 127.0.0.1
port: 9200
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
# 下面用戶名密碼修改爲自己es的用戶密碼
http_auth: elastic:123456
timeout:
master_only: True
logging:
loglevel: INFO
logfile:
logformat: default
blacklist: ['elasticsearch', 'urllib3']
然後就是action.yml 文件,定義需要執行的操作,我們這裏需要刪除索引中時間過長的歷史數據,詳細的操作文件action.yml配置的字段和用法,詳見官方文檔:
actions:
1:
action: delete_indices # 這裏執行操作類型爲刪除索引
description: "delete index expire date"
options:
ignore_empty_list: True
timeout_override:
continue_if_exception: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix # 這裏是指匹配前綴爲 “yaobili-” 的索引,還可以支持正則匹配等,詳見官方文檔
value: logstash-
# 這裏匹配時間
- filtertype: age
source: name # 這裏不單可以根據name來匹配,還可以根據字段等,詳見官方文檔
direction: older
# 這裏定義的是days,還有weeks,months等,總時間爲unit * unit_count
unit: days
unit_count: 7
timestring: '%Y.%m.%d' # 這裏是跟在logstash-後面的時間的格式
ok,定義了兩個文件後,則可以直接使用命令行進行執行:指定兩個文件的路徑即可。
curator --config curator.yml action.yaml
輸出日誌:
2019-01-02 16:27:28,721 INFO Preparing Action ID: 1, "delete_indices"
2019-01-02 16:27:28,733 INFO Trying Action ID: 1, "delete_indices": delete expire index
2019-01-02 16:27:28,800 INFO Skipping action "delete_indices" due to empty list: <class 'curator.exceptions.NoIndices'>
2019-01-02 16:27:28,800 INFO Action ID: 1, "delete_indices" completed.
2019-01-02 16:27:28,800 INFO Job completed
最後,將此命令添加到crontab中即可,怎麼添加到crontab就不贅述了,不懂的參考我另一篇博文《centos7.2 利用crontab執行定時計劃任務》
好了,到此,兩種方法都說完了,有什麼問題,歡迎留言,一同學習,一同進步