ELK 5.4.0 实战心得及安装步骤、配置等(Java) --- 叁

这一篇讲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的配置的,但是因为代码内置的逻辑有点多,如果我把逻辑都删除,那么就没法看了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值