简介
- ELK生态之Logstash导入数据到Elasticsearch;
- 数据源:csv格式文件;
- Elasticsearch和Logstash版本:5.6.1;
- 前提环境: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"
#覆盖模板,不需要可注释掉,通用模板下载:
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的时候,可用于一对一匹配输入或者输出;
注意事项
- logstash启动之后,进程会一直处于运行状态,若csv文件被修改,程序会自动监听,导入新数据;
- 若需要重新导入数据,则需要删除logstash安装目录下\plugins\inputs\file下的文件(该文件属于隐藏文件),所以直接删除该目录即可,之后目录会重新生成;
总结
- Logstash读取csv文件内容导入Elasticsearch,在数据源采集方面特别普遍,采集配置方式也特别简洁,程序猿有兴趣可继续深入挖掘;
- 实践是检验认识真理性的唯一标准,自己动手丰衣足食~