ELK日誌保留7天-索引生命週期策略

包子wxl發表於2022-04-05

一、簡介

ELK日誌我們一般都是按天儲存,例如索引名為"kafkalog-2022-04-05",因為日誌量所佔的儲存是非常大的,我們不能一直儲存,而是要定期清理舊的,這裡就以保留7天日誌為例。

自動清理7天以前的日誌可以用定時任務的方式,這樣就需要加入多一個定時任務,可能不同服務記錄的索引名又不一樣,這樣用定時任務配還是沒那麼方便。

ES給我們提供了一個索引的生命週期策略(lifecycle),就可以對索引指定刪除時間,能很好解決這個問題。

 

索引生命週期分為四個階段:HOT(熱)=>WARM(溫)=》COLD(冷)=>DELETE(刪除)

二、給索引設生命週期策略(ILM)

1.配置生命週期策略(policy)

這裡為ELK日誌超過7天的自動刪除,所以只需要用到DELETE(刪除階段)

PUT _ilm/policy/auto_delete_policy   
{
  "policy": {                       
    "phases": {
      "delete": {
        "min_age": "7d",           
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

 

建立一個自動刪除策略(auto_delete_policy)

delete:刪除階段,7天執行刪除索引動作

檢視策略:GET _ilm/policy/

2.建立索引模板

索引模板可以匹配索引名稱,匹配到的索引名稱按這個模板建立mapping

PUT _template/elk_template
{
  "index_patterns": ["kafka*"],                 
  "settings": {
    "index":{
      "lifecycle":{
        "name":"auto_delete_policy",
        "indexing_complete":true
      }
    }
    
  }
}

 

建立索引模板(elk_tempalte),index.lifecycle.name把上面的自動刪除策略繫結到elk索引模板

建立kafka開頭的索引時就會應用這個模板。

indexing_complete:true,必須設為true,跳過HOT階段的Rollover

檢視模板:GET /_template/

3.測試效果

logstash配置:

logstash接收kafka的輸入,輸出到es。

input {
     kafka {
      type=>"log1"
      topics => "kafkalog" #在kafka這個topics提取資料
      bootstrap_servers => "127.0.0.1:9092"  # kafka的地址
      codec => "json"  # 在提取kafka主機的日誌時,需要寫成json格式
            }
}

output {
    if [type] =="log1"
    {
  elasticsearch {
    hosts => ["127.0.0.1:9200"] #es地址
    index => "kafkalog%{+yyyy.MM.dd}" #把日誌採集到es的索引名稱
    # user => "elastic"
    # password => "123456"
        }
    }
}

 

這裡測試時把DELETE的日期由7天"7d"改為1分鐘"1m"。

生命週期策略預設10分鐘檢測一次,為了方便測試,這裡設為30s。

PUT /_cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"30s" 
  }
}

 

把日誌寫入到es後,檢視日誌索引的生命週期策略資訊。

GET kafka*/_ilm/explain          檢視kafka開頭索引的生命週期策略

 

過一會再點查詢,索引已經沒有了,說明已經生效。

 

相關文章