插件介绍

Http插件是2.0版本才出现的新插件,1.x是没有这个插件的。这个插件可以帮助logstash接收其他主机或者本机发送的http报文。

插件的原理很简单,它自己启动了一个ruby的服务器,用于接收Http请求。然后会把host(IP地址)和header相关的信息添加到event中。

下面就看看这个插件如何使用吧!

基本配置

先看看默认的配置吧!

http {}

简单到心碎啊!其实有很多参数都是默认的...

上面的配置其实相当于:

http{
host => "0.0.0.0"
port => 8080
additional_codecs => {"application/json"=>"json"}
codec => "plain"
threads => 4
ssl => false
}

参数详解

最主要的几个参数,也是Http中常见的属性:

host

默认是0.0.0.0,即所有的地址都可以发送到本机,从而接收Http信息。

port

是http插件中服务器运行的端口号。只要发送到“本机IP”:"该端口号"的数据都可以被http插件接收到。

additional_codecs

配置文本类型和codec的映射,如上面所示,默认配置了json文本对应使用json的codec。

codec

如果上面的映射集合中找不到文本类型对应的codec,那么会默认按照这个属性配置的codec解析。

ssl

是否开启SSL。

threads

ruby插件中服务器的启动线程,这里默认是4个。

user、password、keystore、keystore_password

这些都与http的认证有关系了,就不多说了。如果想要使用,再去参考文档吧!

源码初探

阅读插件的源码是为了更好的理解插件的使用,并且在出错的时候知道哪里出现了问题。Logstash的插件往往都有固定的书写格式,因此很容易看到插件的核心代码。

在Input插件中,主要包含两个方法:

public
def register
# register方法相当于初始化的构造方法
end # def register # 主要的核心业务方法都在run中
def run(queue)
Stud.interval(@interval) do
# 创建事件
event = LogStash::Event.new("message" => @message, "host" => @host)
# 装饰event对象
decorate(event)
# 放入队列中
queue << event
end # loop
end # def run

下面看看http的插件内容吧!

首先看看register都做了什么吧!

 def register
require "logstash/util/http_compressed_requests"
# 创建Puma服务器
@server = ::Puma::Server.new(nil) # we'll set the rack handler later
# 下面的都是跟认证相关的....
if @user && @password then
token = Base64.strict_encode64("#{@user}:#{@password.value}")
@auth_token = "Basic #{token}"
end
if @ssl
if @keystore.nil? || @keystore_password.nil?
raise(LogStash::ConfigurationError, "Settings :keystore and :keystore_password are required because :ssl is enabled.")
end
ctx = Puma::MiniSSL::Context.new
ctx.keystore = @keystore
ctx.keystore_pass = @keystore_password.value
ctx.verify_mode = case @verify_mode
when 'peer'
Puma::MiniSSL::VERIFY_PEER
when 'force_peer'
Puma::MiniSSL::VERIFY_PEER | Puma::MiniSSL::VERIFY_FAIL_IF_NO_PEER_CERT
when 'none'
Puma::MiniSSL::VERIFY_NONE
end
@server.add_ssl_listener(@host, @port, ctx)
else
@server.add_tcp_listener(@host, @port)
end
# 设置线程的数量
@server.min_threads = 0
@server.max_threads = @threads
@codecs = Hash.new
# 创建文本类型对应的codecs映射
@additional_codecs.each do |content_type, codec|
@codecs[content_type] = LogStash::Plugin.lookup("codec", codec).new
end
end # def register

可以简单的把上面的代码归纳为:

  • 1 创建Puma服务器,Puma是一款ruby的高性能服务器。
  • 2 进行用户身份和密码的验证授权
  • 3 设置基本的线程信息
  • 4 创建codecs映射

再看看run方法

def run(queue)
p = Proc.new do |req|
begin
remote_host = req['puma.socket'].peeraddr[3]
REJECTED_HEADERS.each {|k| req.delete(k) }
req = lowercase_keys(req)
body = req.delete("rack.input")
# 这里使用相应的codec解析对应的Body信息
@codecs.fetch(req["content_type"], @codec).decode(body.read) do |event|
# 这里遍历每个事件,然后添加host和headers信息
event["host"] = remote_host
event["headers"] = req
decorate(event)
queue << event
end
# 如果正常处理,则返回ok
['200', @response_headers, ['ok']]
rescue => e
@logger.error("unable to process event #{req.inspect}. exception => #{e.inspect}")
['500', @response_headers, ['internal error']]
end
end auth = Proc.new do |username, password|
username == @user && password == @password.value
end if (@user && @password) @server.app = Rack::Builder.new do
use(Rack::Auth::Basic, &auth) if auth
use CompressedRequests
run(p)
end
@server.run.join
end private
def lowercase_keys(hash)
new_hash = {}
hash.each_pair do |k,v|
new_hash[k.downcase] = v
end
new_hash
end

看了上面的代码,基本对http的原理有了一定了解吧!

[logstash-input-http] 插件使用详解的更多相关文章

  1. fullPage教程 -- 整屏滚动效果插件 fullpage详解

    1.引用文件 [html] view plain copy print?在CODE上查看代码片派生到我的代码片 <link rel="stylesheet" href=&qu ...

  2. maven常用插件配置详解

    常用插件配置详解Java代码    <!-- 全局属性配置 --> <properties> <project.build.name>tools</proje ...

  3. jQuery Pagination Ajax分页插件中文详解(摘)

    jQuery Pagination Ajax分页插件中文详解 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxin ...

  4. jQuery form插件使用详解

    点击打开: jquery选择器全解 jquery中的style样式操作 jquery中的DOM操作 jquery中的事件操作全解 jquery中的动画操作全解 jquery中ajax的应用 自定义jq ...

  5. Maven 变量及常见插件配置详解

    Maven 的 pom.xml 常用 变量 插件 配置 详解 一.变量 - 自定义变量及内置变量 1. 自定义变量 <properties> <project.build.name& ...

  6. JRebel插件使用详解(IDEA热部署)(Day_44)

    JRebel插件使用详解 简介 JRebel是一套JavaEE开发工具. Jrebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率. JRebel是一款JAVA虚拟机插件,它使得JAVA ...

  7. [logstash-input-redis]插件使用详解

    Redis插件参数配置详解 最小化配置 input { redis { data_type => "list" #logstash redis插件工作方式 key => ...

  8. [logstash-input-log4j]插件使用详解

    Log4j插件可以通过log4j.jar获取Java日志,搭配Log4j的SocketAppender和SocketHubAppender使用,常用于简单的集群日志汇总. 最小化的配置 input { ...

  9. elk之[logstash-input-file]插件使用详解

    https://www.cnblogs.com/xing901022/p/4805586.html http://www.cnblogs.com/xing901022/p/4802822.html   ...

随机推荐

  1. 排序 via F#

    冒泡排序: let rec bsort_asc s = let rec _bsort_asc = function |x1::x2::xs when x1 > x2 -> match _b ...

  2. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  3. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  4. 解读jQuery中extend函数

    $.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...

  5. Android手动签名

    在生成release build时可实现自动签名,所谓手动签名,就是在命令行下完成签名,落实到Android Studio里面,就是在terminal里面做. 下面是三个命令,第一个签名,第二个验证, ...

  6. [源码]NumberToUpper 数字转中文

    使用时需开启unsafe选项 构造函数有4个参数 number : 数字文本 isSimplified : 是否只使用简体中文,默认:false isMoney : 是否是金额模式(忽略小数点后3位, ...

  7. JavaScript 误区

    接触JavaScript两年多遇到过各种错误,其中有一些让人防不胜防,原来对JavaScript的误会如此之深,仅以此文总结一下常见的各种想当然的误区 String replace string的re ...

  8. IOS 其它语言比较-Objc与JAVA的比较

    1. Objc是一门编译型语言,JAVA是解析型语言 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运行这个程序. 编译型语言,执行速度快.效率高:依赖编译器.跨平台性差些. ...

  9. IOS 公共类-MyMBProgressUtil Progress显示

    IOS 公共类-MyMBProgressUtil Progress显示 此公共类用于显示提示框,对MBProgress的进一步封装.可以看下面的代码 接口: @interface MyMBProgre ...

  10. oracle 表类型变量的使用

    转载于:http://www.itxuexiwang.com/a/shujukujishu/oracle/2016/0216/89.html?1455872314 使用记录类型变量只能保存一行数据,这 ...