1.直接下载解压,版本要和es一样最好,本次安装的为7.6
下载地址:
https://www.elastic.co/cn/downloads/past-releases#logstash
2.在bin目录下新建.conf文件(名称随意),比如logstash.conf,填入如下配置,一个jdbc对应一个表
input {
stdin {
}
jdbc {
# 配置数据库信息
jdbc_connection_string => "jdbc:mysql://localhost:3306/jgmes_xinyuan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "root"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone => "Asia/Shanghai"
# mysql驱动所在位置,去maven里面找,F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java
jdbc_driver_library => "F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"
#sql执行语句
statement => "SELECT * FROM jgmes_pb_bgsj WHERE SY_CREATETIME > :sql_last_value"
#指定路径,t_01文件会自动生成,用来存放最后一次运行时间sql_last_value的值,logstash自带的,一个jdbc对应一个
last_run_metadata_path => "F:\ElasticSearch\logstash-7.6.1\logs\last_run_time\t_01"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
#每次重启logstash,就重新同步数据,相当于第一次全量同步,接下来就增量同步,看情况设置,
#假如为false,当你停掉logstash,mysql又插入数据,那这些数据是无法同步到es中的,如果你的数据量特别大,那就false吧
clean_run => true
# 是否将 sql 中 column 名称转小写
lowercase_column_names => false
#解决中文乱码问题
codec => plain { charset => "UTF-8"}
# 索引类型
type => "t_01"
}
jdbc {
# 配置数据库信息
jdbc_connection_string => "jdbc:mysql://localhost:3306/jgmes_xinyuan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "root"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone => "Asia/Shanghai"
# mysql驱动所在位置,去maven里面找,F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java
jdbc_driver_library => "F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"
#sql执行语句
statement => "SELECT * FROM jgmes_plan_scrw WHERE SY_CREATETIME > :sql_last_value"
#指定路径,t_02文件会自动生成,用来存放最后一次运行时间sql_last_value的值,logstash自带的,一个jdbc对应一个
last_run_metadata_path => "F:\ElasticSearch\logstash-7.6.1\logs\last_run_time\t_02"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
#每次重启logstash,就重新同步数据,相当于第一次全量同步,接下来就增量同步,看情况设置,
#假如为false,当你停掉logstash,mysql又插入数据,那这些数据是无法同步到es中的,如果你的数据量特别大,那就false吧
clean_run => true
# 是否将 sql 中 column 名称转小写
lowercase_column_names => false
#解决中文乱码问题
codec => plain { charset => "UTF-8"}
# 索引类型
type => "t_02"
}
jdbc {
# 配置数据库信息
jdbc_connection_string => "jdbc:mysql://localhost:3306/jgmes_xinyuan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "root"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone => "Asia/Shanghai"
# mysql驱动所在位置,去maven里面找,F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java
jdbc_driver_library => "F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"
#sql执行语句
statement => "SELECT * FROM jgmes_base_productdata WHERE SY_CREATETIME > :sql_last_value"
#指定路径,t_03文件会自动生成,用来存放最后一次运行时间sql_last_value的值,logstash自带的,一个jdbc对应一个
last_run_metadata_path => "F:\ElasticSearch\logstash-7.6.1\logs\last_run_time\t_03"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
#每次重启logstash,就重新同步数据,相当于第一次全量同步,接下来就增量同步,看情况设置,
#假如为false,当你停掉logstash,mysql又插入数据,那这些数据是无法同步到es中的,如果你的数据量特别大,那就false吧
clean_run => true
# 是否将 sql 中 column 名称转小写
lowercase_column_names => false
#解决中文乱码问题
codec => plain { charset => "UTF-8"}
# 索引类型
type => "t_03"
}
jdbc {
# 配置数据库信息
jdbc_connection_string => "jdbc:mysql://localhost:3306/jgmes_xinyuan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_user => "root"
jdbc_password => "root"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
jdbc_default_timezone => "Asia/Shanghai"
# mysql驱动所在位置,去maven里面找,F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java
jdbc_driver_library => "F:\maven\apache-maven-3.5.2\maven-repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"
#sql执行语句
statement => "SELECT * FROM jgmes_gygl_gylxgx WHERE SY_CREATETIME > :sql_last_value"
#指定路径,t_04文件会自动生成,用来存放最后一次运行时间sql_last_value的值,logstash自带的,一个jdbc对应一个
last_run_metadata_path => "F:\ElasticSearch\logstash-7.6.1\logs\last_run_time\t_04"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
#每次重启logstash,就重新同步数据,相当于第一次全量同步,接下来就增量同步,看情况设置,
#假如为false,当你停掉logstash,mysql又插入数据,那这些数据是无法同步到es中的,如果你的数据量特别大,那就false吧
clean_run => true
# 是否将 sql 中 column 名称转小写
lowercase_column_names => false
#解决中文乱码问题
codec => plain { charset => "UTF-8"}
# 索引类型
type => "t_04"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
if[type]=="t_01"{
#grok插件 将非结构化数据解析为结构化和可查询的数据,比如:日志
#data插件 将日期字段解析为中间带T格式时间,就是es的时间类型
#如果字段BGSJ_GZSJ属于后面日期中的一种,就把BGSJ_GZSJ转换为中间带T格式时间
#一个date里边只能一个match和一个target
#target默认指的就是@timestamp,所以target不写就是给@timestamp设置时间格式,
#@timestamp属于系统字段,加个@符号,简直让人高深莫测
date {
match => ["BGSJ_GZSJ", "yyyy-MM-dd HH:mm:ss","yyyy-MM-dd","MMM dd yyyy HH:mm:ss","MMM d yyyy HH:mm:ss", "ISO8601"]
target => "BGSJ_GZSJ"
timezone => "Asia/Shanghai"
}
#ruby插件 逻辑判断,操作对象,
#@timestamp为es系统时间字段,但时间不准,这里更改@timestamp+8小时,
#让timestamp显示为正常时间,timestamp和@timestamp不一样
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('BGSJ_GZSJ', event.get('BGSJ_GZSJ') + 8*60*60)"
}
#mutate插件 对字段做处理的,属性有很多这里举例几个,插件都是logstash自带的不需要另外安装
mutate {
#字段重命名,主键id重命名的话,output里面的id应该也要改,最好不改主键id吧
rename => {
"BGSJ_GWID" => "gwid"
"BGSJ_BC" => "bc"
}
#移除字段
remove_field => ["@timestamp","BGSJ_GWMC","BGSJ_CPGG"]
#转变字段类型,能转的就转不能转的会报错,字段为空的转integer会默认赋值0,
#上面重新命名的字段bc,也可以转换,仅支持转换为integer、float、string和Boolean
convert => {
"BGSJ_YGGH" => "string"
"BGSJ_BGBLSL" => "integer"
"bc" => "integer"
}
#存在但为空的字段的默认值
coerce => {
"BGSJ_BLSL" => 0
}
}
}
}
output {
#通过type来进行区分表的数据然后建立索引进行存储
if[type]=="t_01"{
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称
index => "reportbean"
# 文档_id,把mysql数据库报工表的id字段拿过来作为es的id字段
document_id => "%{JGMES_PB_BGSJ_ID}"
manage_template => true #自动管理模板功能,默认为true,不要改成false
template_name => "reportbean" #模板名称
template => "F:\ElasticSearch\logstash-7.6.1\bin\reportbean_temp.json" #映射配置文件的位置
template_overwrite => true #如果设置为true,模板名字一样的时候,新的模板会覆盖旧的
}
}
if[type]=="t_02"{
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称
index => "taskbean"
# 文档_id,把mysql数据库生产任务表的id字段拿过来作为es的id字段
document_id => "%{JGMES_PLAN_SCRW_ID}"
}
}
if[type]=="t_03"{
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称
index => "productbean"
# 文档_id,把mysql数据库生产任务表的id字段拿过来作为es的id字段
document_id => "%{JGMES_BASE_PRODUCTDATA_ID}"
}
}
if[type]=="t_04"{
elasticsearch {
# ES的IP地址及端口
hosts => ["127.0.0.1:9200"]
# 索引名称
index => "processtoprocessstepbean"
# 文档_id,把mysql数据库生产任务表的id字段拿过来作为es的id字段
document_id => "%{GYLXGX_ID}"
}
}
stdout {
# JSON格式输出
codec => json_lines
}
}
3.在bin目录 新建 reportbean_temp.json 模板,填入你的字段
“order”: 1, //是优先级,越大越优先,系统默认模板为0,所以你要大于它
“template”: “reportbean”, //模板名称 和conf文件output 里的对应
properties: 里面定义需要的字段,以及字段类型
{
"order": 1,
"template": "reportbean",
"settings": {
"index": {
"refresh_interval": "5s"
}
},
"mappings": {
"properties": {
"JGMES_PB_BGSJ_ID" : {
"type" : "keyword"
},
"BGSJ_CXBM" : {
"type" : "keyword"
},
"BGSJ_SCRW" : {
"type" : "keyword"
},
"BGSJ_CPBH" : {
"type" : "keyword"
},
"BGSJ_GXBH" : {
"type" : "keyword"
},
"BGSJ_SL" : {
"type" : "long"
},
"SY_CREATETIME" : {
"format" : "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || date_optional_time ||epoch_millis",
"type" : "date"
}
}
},
"aliases": {}
}
4.检查配置文件是否正确,在bin目录命令行窗口里输入:
logstash -f logstash.conf -t
出现 Configuration OK 表示配置文件正确
5. 启动logstash
输入 logstash -f logstash.conf
启动成功之后,logstash会自动连接数据库,并将数据自动导入elasticsearch 中。