这一篇讲logstash的自定义配置文件
在实际项目中,单项的输入输出很难达到我们想要的结果,那么就出现了多配置输出输入项,贴上代码
input {
stdin {
}
jdbc {
jdbc_connection_string => "jdbc:mysql://**.**.1.160:3306/acai"
jdbc_user => "root"
jdbc_password => "acai_**"
jdbc_driver_library => "/usr/local/program/logstash-5.4.0/myconf-all/mysql-connector-java-5.1.5.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
statement_filepath => "/usr/local/program/logstash-5.4.0/myconf-all/acai_sku.sql"
schedule => "* * * * *"
type => "acai_sku"
}
jdbc {
jdbc_connection_string => "jdbc:mysql://**.**.1.160:3306/acai"
jdbc_user => "root"
jdbc_password => "acai_**"
jdbc_driver_library => "/usr/local/program/logstash-5.4.0/myconf-all/mysql-connector-java-5.1.5.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
statement_filepath => "/usr/local/program/logstash-5.4.0/myconf-all/acai_brand.sql"
schedule => "* * * * *"
type => "acai_brand"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
stdout {
codec => json_lines
}
if[type] == "acai_sku"{
elasticsearch {
hosts => "**.**.1.160:9200"
index => "acai_pr_sku"
document_type => "acai_pr_sku_table"
document_id => "%{skuid}"
}
}
if[type] == "acai_brand"{
elasticsearch {
hosts => "**.**.1.160:9200"
index => "acai_pr_sku"
document_type => "acai_pr_brand_table"
document_id => "%{brandid}"
}
}
}
上边是我们的全量多配置的同步文件,这种缺点是会导致logstash会在特定的时间去扫描数据库。
既然我们知道这种方式并不是很友好,那么该如何解决这些问题呢?
下边我们用到了logstash的增量同步,贴上代码
input {
stdin {
}
jdbc {
# mysql 数据库链接,test为数据库名
jdbc_connection_string => "jdbc:mysql://**.**.1.160:3306/acai"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "acai_**"
# 驱动
jdbc_driver_library => "/usr/local/program/logstash-5.4.0/myconf-increment/mysql-connector-java-5.1.5.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
#处理中文乱码问题
codec => plain { charset => "UTF-8"}
#使用其它字段追踪,而不是用时间
use_column_value => "false"
#追踪的字段
tracking_column => "gmt_modify"
#record_last_run => "true"
#上一个sql_last_value的值 存放路径
#last_run_metadata_path => "/usr/local/propram/logstash-5.4.0/myconf-increment/station_parameter_sku.txt"
#开启分页查询
jdbc_paging_enabled => "true"
jdbc_page_size => "5000"
# 执行的sql 文件路径+名称
statement_filepath => "/usr/local/program/logstash-5.4.0/myconf-increment/acai_sku.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "acai_sku"
}
jdbc {
# mysql 数据库链接,test为数据库名
jdbc_connection_string => "jdbc:mysql://**.**.1.160:3306/acai"
# 用户名和密码
jdbc_user => "root"
jdbc_password => "acai_**"
# 驱动
jdbc_driver_library => "/usr/local/program/logstash-5.4.0/myconf-increment/mysql-connector-java-5.1.5.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
#处理中文乱码问题
codec => plain { charset => "UTF-8"}
#使用其它字段追踪,而不是用时间
use_column_value => "false"
#追踪的字段
tracking_column => "gmt_modify"
#record_last_run => "true"
#上一个sql_last_value的值 存放路径
#last_run_metadata_path => "/usr/local/propram/logstash-5.4.0/myconf-increment/station_parameter_brand.txt"
#开启分页查询
jdbc_paging_enabled => "true"
jdbc_page_size => "300"
# 执行的sql 文件路径+名称
statement_filepath => "/usr/local/program/logstash-5.4.0/myconf-increment/acai_brand.sql"
# 设置监听间隔 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 索引类型
type => "acai_brand"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
stdout {
# JSON格式输出
codec => json_lines
}
if[type] == "acai_sku"{
elasticsearch {
hosts => "**.**.1.160:9200"
index => "acai_pr_sku"
document_type => "acai_pr_sku_table"
document_id => "%{skuid}"
}
}
if[type] == "acai_brand"{
elasticsearch {
hosts => "**.**.1.160:9200"
index => "acai_pr_sku"
document_type => "acai_pr_brand_table"
document_id => "%{brandid}"
}
}
}
呐 我把注释写在了配置文件中,这样便于查看,由于用订单id作为标识同步会导致同步不及时,所以选择了时间,上边的追踪字段(gmt_modify)是我自己在数据库中定义的,当增改时则更新该字段,此时更新的字段的时间是一定小于下一次扫描增量同步的当前时间,故形成了增量更新,而对于删除来说,el并不是那么支持,建议弄一个(del_state) 删除状态来控制。
此处多说一句:其实增量同步 就是在全量同步的基础上 筛选出需要更新的数据 而不是全部更新
熟悉sql的童鞋其实很容易就明白。
这里在贴一个mysql语句便于理解
SELECT
brand_id AS brandId,
brand_name AS brandName,
gmt_modify AS gmtModify
FROM
acai_pr_brand
WHERE
date_add(gmt_modify, interval -8 hour) > :sql_last_value
这里的 date_add(gmt_modify, interval -8 hour)
是因为我的mysql数据库的时间不对,故作此操作。
对于配置来说,作为渣渣的我实在是找不出什么说的来,本来是想贴java的配置的,但是因为代码内置的逻辑有点多,如果我把逻辑都删除,那么就没法看了。