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. 实践是检验认识真理性的唯一标准,自己动手丰衣足食~
发布了79 篇原创文章 · 获赞 276 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/alan_liuyue/article/details/91998144
今日推荐