使用过Logstash的朋友都知道,它强大的插件生态几乎覆盖了所有的开源框架。从基本的http、tcp、udp、file,到强大的kafa、redis、ganglia,还有丰富的解析工具,比如date、json、grok、kv等等,有了它再也不用担心数据不好搜集了!
不过需求是无限的,如果这些框架都不满足怎么办呢?
没关系,十分佩服Logstash的作者,他以插件的方式组织每个部分,使得logstash本身具有超强的扩展性。
Logstash基本组成
有过使用经验的都知道Logstash主要由输入、过滤器、输出三部分组成。
每一部分的插件都符合统一的标准,因此扩展起来也十分容易。
自定义过滤器插件
由于需求大多都是集中在过滤部分,因此这里就简单的介绍下过滤器的自定义写法。
官网上面的过程太过繁琐,比如:
- 1 创建github开源工程
- 2 拷贝样例工程
- 3 替换样例工程基本信息
- 4 编写业务代码
- 5 安装插件
- 6 分享与贡献
但是如果自己用的话,上面做了很多的无用功。我这里提供一个极简的样例工程,插件的目录大致如下:
$ tree logstash-filter-example
├──lib
│ └── logstash
│ └── filters
│ └── mypluginname.rb
├── logstash-filter-example.gemspec
其实只需要这两个文件即可!
先看看logstash-filter-example.gemspec都做了什么吧!
Gem::Specification.new do|s|
s.name ='logstash-filter-example'
s.version ='1.0.0'
s.licenses =['Apache License (2.0)']
s.summary =" "
s.description =" "
s.authors =["xingoo"]
s.email ='xinghalo@163.com'
s.homepage ="http://www.elastic.co/guide/en/logstash/current/index.html"
s.require_paths =["lib"]# Files
s.metadata ={"logstash_plugin"=>"true","logstash_group"=>"filter"}# Gem dependencies
s.add_runtime_dependency 'logstash-core','>= 2.0.0','< 3.0.0'
s.add_development_dependency 'logstash-devutils'
end
上面的信息,只要改改版本和名字,其他的信息基本不需要动。
关键的信息还有:
- s.require_paths定义了插件核心文件的位置
- s.add_runtime_dependency 定义了插件运行的环境
然后再看看logstash-filter-example.rb
这个文件就需要详细说说了,基本的框架如下,
# encoding: utf-8
require "logstash/filters/base"
require "logstash/namespace"
class LogStash::Filters::Example < LogStash::Filters::Base
config_name "example"
config :name,:validate =>:string,:default =>"xingoo!"
public
def register
end
public
def filter(event)
event["name"] = @name
filter_matched(event)
end
end
挨行看看!
首先第一行的# encoding: utf-8
,不要以为是注释就没什么作用。它定义了插件的编码方式。
下面两行:
require "logstash/filters/base"
require "logstash/namespace"
引入了插件必备的包。
class LogStash::Filters::Example < LogStash::Filters::Base
config_name "example"
插件继承自Base基类,并配置插件的使用名称。
下面的一行对参数做了配置,参数有很多的配置属性,完整的如下:
config :variable_name,:validate =>:variable_type,:default =>"Default value",:required => boolean,:deprecated => boolean
其中
- variable_name就是参数的名称了。
- validate 定义是否进行校验,如果不是指定的类型,在logstash -f xxx --configtest的时候就会报错。它支持多种数据类型,比如
:string
,:password
,:boolean
,:number
,:array
,:hash
,:path (a file-system path)
,:codec (since 1.2.0)
,:bytes
. - default 定义参数的默认值
- required 定义参数是否是必须值
- deprecated 定义参数的额外信息,比如一个参数不再推荐使用了,就可以通过它给出提示!典型的就是es-output里面的Index_type,当使用这个参数时,就会给出提示:
config :index_type, :validate => :string, :deprecated => "Please use the 'document_type' setting instead. It has the same effect, but is more appropriately named."
下面的两个方法是插件的核心了!
register
方法相当于初始化的构造方法,可以在里面进行插件的初始化工作。
filter
中则是过滤器的核心代码。
其中event是从input插件中传入的事件对象,它是Logstash::Event的对象,在logstashj-core包中,有兴趣的可以了解一下!
然后在这个方法中可以使用几个默认的方法;
-
filter_matched()
,该方法会把事件传入下一个过滤器 -
add_field
、`remove_field 添加或者移除一个字段 -
add_tags
、remove_tags
添加或者移除一个标签 -
event.cancel
取消当前的事件,即不在继续向下走。(在split插件中有典型的使用场景)
在上面的例子中,定义了一个name参数,在register
中使用@name
实例变量,把参数赋值给event对象。
这个插件的目的就是给每条事件都加上一个name属性。
至此一个插件就算编写完成了!
安装插件
第一步,首先把这个插件文件夹拷贝到下面的目录中
logstash-2.1.0\vendor\bundle\jruby\1.9\gems
第二步,修改logstash根目录下的Gemfile,添加如下的内容:
gem "logstash-filter-example", :path => "vendor/bundle/jruby/1.9/gems/logstash-filter-example-1.0.0"
第三步,编写配置文件,test.conf
:
input{
stdin{
}
}
filter{
example{
name => "test name:xingoo"
}
}
output{
stdout{
codec => rubydebug
}
}
第四步,输入logstash -f test.conf时,输入任意字符,回车~~~大功告成!
是不是,没有想象中的那么难?要想要熟练的编写更复杂的插件,还需要多看官方插件的源码!
参考
1 How to write a Logstash filter plugin
手把手教你编写Logstash插件的更多相关文章
-
[swift实战入门]手把手教你编写2048(一)
苹果设备越来越普及,拿着个手机就想捣鼓点啥,于是乎就有了这个系列,会一步一步教大家学习swift编程,学会自己做一个自己的app,github地址:https://github.com/scarlet ...
-
Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件
Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github ...
-
手把手教你编写一个具有基本功能的shell(已开源)
刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一步步完成一个模拟的shell(我命名之为wshell) ...
-
手把手教你写vue插件并发布(二)
前记:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html, 说到了一个完整的vue插件开发.发布的流程,总结下来就讲了这么一个事,如何注入vue, 如果 ...
-
手把手教你写vue插件并发布(一)
vue的插件开发 这篇文章较长,需要一定的阅读时间.这里有一份改善版本的插件笔记,在一个项目下完成开发.测试.发布的全过程.https://www.cnblogs.com/adouwt/p/96555 ...
-
手把手教你编写一个简单的PHP模块形态的后门
看到Freebuf 小编发表的用这个隐藏于PHP模块中的rootkit,就能持久接管服务器文章,很感兴趣,苦无作者没留下PoC,自己研究一番,有了此文 0×00. 引言 PHP是一个非常流行的web ...
-
手把手教你开发jquery插件(三)
First, i want to add options to Tabs constructor like this: var tabs = $("div.tabs").tabs( ...
-
手把手教你开发jquery插件
I have said that i dislike jQuery UI’s unified API, so i want to get the instance of the component a ...
-
[原创作品]手把手教你怎么写jQuery插件
这次随笔,向大家介绍如何编写jQuery插件.啰嗦一下,很希望各位IT界的‘攻城狮’们能和大家一起分享,一起成长.点击左边我头像下边的“加入qq群”,一起分享,一起交流,当然,可以一起吹水.哈,不废话 ...
随机推荐
-
freeregex-0.01 使用文档
-- freeregex,简化字符串处理 freeregex使用大体分为两个部分: 正则确定 功能操作 正则确定:共有EMAIL.IP等静态属性:anyOf(String regex)静态方法 :和o ...
-
vim--golang代码补全
我想说,我折腾了很久编辑器,试了九种办法 最后我只成功了一种 但我依然想就我混乱的逻辑做下整理 一.一开始,我试图入手ipad编码软件,大概9美金吧,叫Textastic.我试图用它的近亲来试验Tex ...
-
C#中ArrayList和string,string[]数组的转换
转载原地址: http://www.cnblogs.com/nextsoft/articles/2218689.html 1.ArrarList 转换为 string[] : ArrayList li ...
-
Java线程:新特征-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...
-
c# 委托 delegate
委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...
-
使用wininet向FTP服务器发送文件
.h #pragma once #include <windows.h> #include <tchar.h> #include <string> #include ...
-
使用MMS(MongoDB Monitoring Service)监控MongoDB
使用MMS(MongoDB Monitoring Service)监控MongoDB 一.MongoDB简介: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可 ...
-
module_param()函数
1.定义模块参数的方法: module_param(name, type, perm); 其中,name:表示参数的名字; type:表示参数的类型; perm:表示参数的访问权限; ...
-
Spring框架学习之依赖注入
Spring框架从2004年发布的第一个版本以来,如今已经迭代到5.x,逐渐成为JavaEE开发中必不可少的框架之一,也有人称它为Java下的第一开源平台.单从Spring的本身来说,它贯穿着整个表现 ...
-
git体验
(1)git初始化配置#配置用户名git config --global user.name "azcode"#配置邮箱git config --global user.email ...