文章目录
前言
编写该插件的时候踩了蛮多坑,这里记录一下。
1. logstash启动
首先使用如下命令从github clone一份logstash的代码,或者直接下载对应的zip压缩包。
git clone --branch 7.9 --single-branch https://github.com/elastic/logstash.git
--branch
后面是分支名,我使用的是7.9版本的logstash,分支名就是7.9。
下面用$LS_HOME
来表示你本地的logstash根目录。
启动logstash
在$LS_HOME
下执行如下命令来启动logstash,但此时直接启动应该会报错。
bin/logstash -e 'input { stdin {} } output { stdout {} }'
错误信息如下:
根据提示,我们首先要bootstrap环境。在$LS_HOME
下执行下面的命令:
rake bootstrap
成功后如下:
这时启动还是会失败,因为还没有安装任何插件,stdin
和stdout
是无法使用的,执行下面的命令来安装默认插件:
rake plugin:install-default
这一步安装可能需要等一段时间。安装成功后如下:
在执行下面的命令来启动logstash:
bin/logstash -e 'input { stdin {} } output { stdout {} }'
启动成功后如下:
输入“hello world”,在控制台上可以看到返回的结果。logstash启动成功。用ctrl+c
来停止logstash。
2. 生成.jar文件
在$LS_HOME
下执行下面的命令来编译logstash
./gradlew assemble
此时应该生成一个$LS_HOME/logstash-core/build/libs/logstash-core-x.y.z.jar
,其中x,y,z是版本号。这个.jar文件稍后需要用到。
3. 下载并配置插件demo
logstash官方为我们提供了一个output-plugin的示例代码(JAVA版本),地址在这里:Example,直接下载到本地并解压。在IDEA中打开该项目。
首先,在该项目目录下创建一个文件命名为gradle.properties
在该文件内写入一行内容:
LOGSTASH_CORE_PATH=<target_folder>/logstash-core
<target_folder>
修改为本地的logstash的路径。
此时如果项目有报错,修改build.gradle
文件,将文件最后的
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")
}
}
刷新一下项目即可。
4. demo代码说明
类的声明
@LogstashPlugin(name="java_output_example")
public class JavaOutputExample implements Output {
每个插件都必须加上这个@LogstashPlugin
注解,其中name
属性就是这个插件的名字,比如在这个例子中,插件的名字就叫做"java_output_example",那我们使用的时候就得在logstash的启动配置文件中写上
output {
java_output_example {
.... } }
表示输出使用“java_output_example”这个插件。
还有一点非常重要,就是name
属性的值(java_output_example
)和类的名字(JavaOutputExample
)在必须是一样的(忽略大小写和下划线)。
插件设置
public static final PluginConfigSpec<String> PREFIX_CONFIG =
PluginConfigSpec.stringSetting("prefix", "");
@Override
public Collection<PluginConfigSpec<?>> configSchema() {
return Collections.singletonList(PREFIX_CONFIG);
}
这个就是用来传参的,我们通过配置启动logstash时,通常会在配置文件中指定一些参数,比如
output {
java_output_example {
prefix => "test"
}
}
这个prefix
就是从配置文件中传进来的,因此代码中有一个PREFIX_CONFIG
用来接收这个参数。stringSetting()
方法的第一个参数就是指传进来的参数名,如果我们还有其他参数,比如topic
,可以创建一个TOPIC_CONFIG
,并指定stringSetting()
方法的第一个参数为topic
。
configSchema()
方法就是返回这些配置参数的集合。
构造器
这个应该不需要解释了,就是取出配置参数的值。但是,必须有一个构造器的参数为String
,Configuration
和Context
。就像demo中给的构造器这样
// all plugins must provide a constructor that accepts id, Configuration, and Context
public JavaOutputExample(final String id, final Configuration configuration, final Context context) {
this(id, configuration, context, System.out