java logstash 自定义插件

java logstash 自定义插件

  1. 编译源码

    • 下载gradle 配置gradle-6.6\init.d 为国内镜像地址

      allprojects {
          repositories {
              maven { url 'file:///C:/Java/maven_repository'}
              mavenLocal()
              maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
              maven { name "Bstek" ; url "http://nexus.bsdn.org/content/groups/public/" }
              mavenCentral()
          }
      
          buildscript { 
              repositories { 
                  maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
                  maven { name "Bstek" ; url 'http://nexus.bsdn.org/content/groups/public/' }
                  maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
              }
          }
      }
      
    • git clone --branch v7.2.0 --single-branch https://github.com/elastic/logstash.git v7.2.0为对应版本,目前7 版本以下不能使用,编译出来少rubyUtils.gradle

    • 编译源码 gradlew.bat assemble,这儿要花一个多小时,下依赖比较久

      成功编译后会生成 ./logstash/logstash-core/build/libs/logstash-core-7.2.0.jar,这个jar 后面依赖要使用

  2. 下载dome

    • git clone https://github.com/logstash-plugins/logstash-filter-java_filter_example.git

    • 在项目中添加一个gradle.properties,内容为编译后logstash 路径

      LOGSTASH_CORE_PATH=D:\\logstash6.8.6\\logstash\\logstash-core  
      
  3. 修改代码(以input 为例)

    • 修改build.gradle 镜像地址

    • 防止报以下错误,修改build.gradle task.register 任务

No signature of method: org.gradle.api.internal.tasks.DefaultTaskDependency$TaskDependencySet.getAt() is applicable for argument types: (ArrayList) values: [[task ‘:downloadAndInstallJRuby’, task ‘:removeObsoleteJars’, …]]
Possible solutions: getAt(java.lang.String), getAt(java.lang.String), getAt(int), head(), putAt(java.lang.String, java.lang.Object), wait()

 ```
     修改前:
     tasks.register("gem"){
          dependsOn [downloadAndInstallJRuby,removeObsoleteJars,vendor,generateRubySupportFiles]
          doLast {
            buildGem(projectDir, buildDir, pluginInfo.pluginFullName() + ".gemspec")
          }
      }
      
      修改后:
     tasks.register("gem"){
         dependsOn downloadAndInstallJRuby
         dependsOn removeObsoleteJars
         dependsOn vendor
         dependsOn generateRubySupportFiles
         doLast {
             buildGem(projectDir, buildDir, pluginInfo.pluginFullName() + ".gemspec")
         }
     }
 ```
  • 编写类实现Input 接口,实现方法

    package org.logstashplugins;
    
    import co.elastic.logstash.api.*;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import org.logstashplugins.utils.ArtemisPostUtil;
    
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.Map;
    import java.util.concurrent.CountDownLatch;
    import java.util.function.Consumer;
    
    /**
     * @program: logstash-input-java_input_example-master
     * @description:  http 自定义插件
     * @author: HeFaQiang
     * @create: 2020-12-21 16:09
     **/
    @LogstashPlugin(name="http_plus")
    public class HttpPlus implements Input {
            private final CountDownLatch done = new CountDownLatch(1);
            private volatile boolean stopped=false;
    
            private String id;
            private String host;
            private String url;
            private String key;
            private String secret;
    
            public static final PluginConfigSpec<String> HOST_CONFIG =
                    PluginConfigSpec.stringSetting("host", "",false,true);
    
            public static final PluginConfigSpec<String> URL_CONFIG =
                    PluginConfigSpec.stringSetting("url", "",false,true);
    
            public static final PluginConfigSpec<String> KEY_CONFIG =
                    PluginConfigSpec.stringSetting("key", "",false,true);
    
    
            public static final PluginConfigSpec<String> SECRET_CONFIG =
                    PluginConfigSpec.stringSetting("secret", "",false,true);
    
    
            public HttpPlus(String id, Configuration config, Context context) {
                    this.id = id;
                    host =config.get(HOST_CONFIG);
                    url=config.get(URL_CONFIG);
                    key=config.get(KEY_CONFIG);
                    secret=config.get(SECRET_CONFIG);
    
            }
            @Override
            public void start(Consumer<Map<String, Object>> consumer) {
                    try {
                            ArtemisPostUtil artemisPostUtil=new ArtemisPostUtil(host,key,secret);
                            if(!stopped){
                                    String countResult = ArtemisPostUtil.callPostApi("1", "1", url);
                                    int count = JSONObject.parseObject(countResult).getJSONObject("data").getInteger("total");
                                    int end = count / 1000 + 2;
    
                                    for (int i = 1; i < end; i++) {
                                            //每次返回1000条数据
                                            String result = ArtemisPostUtil.callPostApi(i + "", "1000", url);
                                            JSONObject object = JSONObject.parseObject(result);
    
                                            JSONArray jsonArray = object.getJSONObject("data").getJSONArray("list");
                                            for (int j = 0; j < jsonArray.size(); j++) { //1000条数据
                                                    JSONObject jsonObject = jsonArray.getJSONObject(j);
                                                    if(jsonObject!=null&& jsonObject.size()!=0){
                                                            consumer.accept((Map)jsonObject);
                                                    }
                                            }
                                    }
    
                            }
                    } finally {
                           stopped=true;
                           done.countDown();
                    }
            }
    
            @Override
            public void stop() {
                    stopped = true;
            }
    
            @Override
            public void awaitStop() throws InterruptedException {
                    done.await();
            }
    
            @Override
            public Collection<PluginConfigSpec<?>> configSchema() {
                    return Arrays.asList(HOST_CONFIG, KEY_CONFIG, URL_CONFIG, SECRET_CONFIG);
            }
    
            @Override
            public String getId() {
                    return this.id;
            }
    }
    
    
  • @LogstashPlugin(name=“elasticsearch_plus”) name 是以后使用logstash的模块名,一定要与类名一样,用下划线间隔,自定义的属性名,不能使用大写,识别不了,如host,index

    • 备注:发送event的,只能等执行了stop 后,consumer 才能接受到数据
  1. 打包

    • 修改build.gradle 修改为自己定义的类及name

      pluginInfo.pluginClass     = "HttpPlus"
      pluginInfo.pluginName      = "http_plus"
      
    • gradlew gem 第一次打包比较久(30-60分钟),要下载ruby 等一些依赖

      后面打包,注释build.gradle 这行,就不用每次去下载ruby,大概只用花30s 
      // dependsOn downloadAndInstallJRuby
      
    • 打包完成后,生成 如logstash-input-http_plus-1.0.1.gem 以.gem 结尾的文件

  2. 安装插件

    • 登录到logstash 所在服务器 cd $LOGSTASH_HOME

    • 修改Gemfile,把镜像修改为国内镜像

      source "https://gems.ruby-china.com" 
      
  • 安装插件,第一次比较久,大概30m

    bin/logstash-plugin install --no-verify --local /home/logstash/logstash-6.8.6/logstash-input-http_plus-1.0.1.gem 以.gem
    

6.运行

  • 编写conf

    input{
        http_plus{
    	      host => ""
    		  url => "" 
    		  key => ""
              secert => ""		  
    	}
    }
    
    output {
    
        stdout {
    
            # JSON格式输出
    
            codec => json_lines
    
        }
    }
    
    
    
  • 运行 bin/logstash --java-execution -f /home/logstash/logstash-6.8.6/java_input.conf

7.离线安装

  • 导出插件
    bin/logstash-plugin prepare-offline-pack --overwrite --output logstash-output-jdbc.zip logstash-output-jdbc
  • 安装插件
    bin/logstash-plugin install file:///home/logstash/logstash-6.8.6/logstash-output-jdbc.zip

8.源码和代码下载

  • 链接 https://pan.baidu.com/s/1eldt68JKaJHDwzbLVPDUTg
  • 提取码 qvak
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值