ELK生態:Logstash增量讀取csv文件數據,導入到Elasticsearch

簡介

  1. ELK生態之Logstash導入數據到Elasticsearch;
  2. 數據源:csv格式文件
  3. Elasticsearch和Logstash版本:5.6.1
  4. 前提環境:Elasticsearch單機或集羣;Logstash客戶端

實踐

  • csv文件內容:
"sixmonth","23","男","1998/6/3 18:31:46"
"xiaoming","23","男","1999/6/3 18:31:46"
"xiaodong","23","男","1997/6/3 18:31:46"

 

  • logstash.conf配置:

#1.讀取數據csv文件,數據輸入階段
input {
    file{
        #設置csv文件路徑,多個文件路徑可設置成數組[],模糊匹配用*
        #指定單一文件
        path => "/data/es/logstash-5.6.1/files/test.csv"
        #指定數組文件
        #path => ["/data/es/logstash-5.6.1/files/test-1.csv","/data/es/logstash-5.6.1/files/test-2.csv"]
        #指定同級目錄模糊匹配
        #path => "/data/es/logstash-5.6.1/files/test*.csv"
        #指定多級目錄模糊匹配
        #path => "/data/es/logstash-5.6.1/files/**/test*.csv"
        
        #可設置成begining或end,begining表示從頭開始讀取文件,end表示讀取最新數據,可和ignore_older一起使用
        #begining只針對首次啓動是否需要讀取所有的歷史數據,而當csv文件修改了之後,同樣會自動增量更新新數據
        start_position => beginning
        
        #表示針對多久的文件進行監控,默認一天內的文件,單位爲秒,0表示不忽略任何過期日誌
        #ignore_older => 86400
        
        #表示多久檢查一次被監聽文件的變化,默認1s
        #stat_interval => 1
        
        #當存在多個文件的時候可使用type指定輸入輸出路徑
        type => "csv_index"
    }
 }  
  
#2.過濾格式化數據階段
filter {

    #讀取csv文件
    csv {
     #設置拆分符爲逗號
     separator => ","
 
     #指定csv文件的字段,必須要和csv文件中的字段順序一致
     columns => ["name","age","sex","updatetime"]
 
     #指定字段的數據格式,也可在mutate轉換:integer, float, date, date_time, boolean
     convert => {"age" => "float"}
     
   }
   
   #轉換其他數據格式
   mutate {
    convert => {
      "name" => "string"
      "sex" => "string"
    }
   }
   
   mutate{
        #將lat和lng兩字段數據合併成mergestr字段
        add_field => ["mergestr", "%{age}, %{sex}"]
        
        #刪除無效的字段,可自定義
        remove_field => ["@version","message","host","path"]
    }
    
    #獲取日誌中的時間字符串,轉換成時間格式,或者替換成其他的字段
    date {
        match => ["updatetime", "yyyy/MM/dd HH:mm:ss"]
        #直接將updatetime轉換時間格式
        target => "updatetime"
        #使用updatetime轉換後的時間格式替換掉@timestamp時間
        #target => "@timestamp"
    }
    
    #新增timestamp字段,將@timestamp時間增加8小時
    ruby { code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)" }
    
}

#3.數據輸出到ES階段
output {

    #日誌輸出格式,json_lines;rubydebug等
    stdout {
        codec => rubydebug
    }
    
    #輸出到es
    if[type] == "csv_index"{
    
        #無法解析的json不記錄到elasticsearch中
        if "_csvparsefailure" not in [tags] {    
            elasticsearch {
                #es地址ip端口
                hosts => "127.0.0.1:9200"
                #索引
                index => "csv_index"
                #類型
                document_type => "csv_index"
                #覆蓋模板,不需要可註釋掉,通用模板下載:https://download.csdn.net/download/alan_liuyue/11241484
                template_overwrite=>true
                template=>"/data/es/logstash-5.6.1/template/logstash.json"         
                
            }
        }
    }
    
}

 

  •  補充file-input字段說明:
codec => #可選項,默認是plain,可設置其他編碼方式;

discover_interval => #可選項,logstash多久檢查一下path下有新文件,默認15s;

exclude => #可選項,排除path下不想監聽的文件;

sincedb_path => #可選項,記錄文件以及文件讀取信息位置的數據文件;

sincedb_write_interval => #可選項,logstash多久寫一次sincedb文件,默認15s;

stat_interval => #可選項,logstash多久檢查一次被監聽文件的變化,默認1s;

start_position => #可選項,表示從哪個位置讀取文件數據,初次導入爲:beginning,最新數據爲:end

path => #必選項,配置文件路徑,可定義多個,也可模糊匹配;

tags => #可選項,在數據處理過程中,由具體的插件來添加或者刪除的標記;

type => #可選項,當有多個file的時候,可用於一對一匹配輸入或者輸出;

 

注意事項

  1. logstash啓動之後,進程會一直處於運行狀態,若csv文件被修改,程序會自動監聽,導入新數據;
  2. 若需要重新導入數據,則需要刪除logstash安裝目錄下\plugins\inputs\file下的文件(該文件屬於隱藏文件),所以直接刪除該目錄即可,之後目錄會重新生成;

總結

  1. Logstash讀取csv文件內容導入Elasticsearch,在數據源採集方面特別普遍,採集配置方式也特別簡潔,程序猿有興趣可繼續深入挖掘;
  2. 實踐是檢驗認識真理性的唯一標準,自己動手豐衣足食~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章