[logstash-input-http] 插件使用详解
插件介绍
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] 插件使用详解的更多相关文章
- fullPage教程 -- 整屏滚动效果插件 fullpage详解
		1.引用文件 [html] view plain copy print?在CODE上查看代码片派生到我的代码片 <link rel="stylesheet" href=&qu ... 
- maven常用插件配置详解
		常用插件配置详解Java代码 <!-- 全局属性配置 --> <properties> <project.build.name>tools</proje ... 
- jQuery Pagination Ajax分页插件中文详解(摘)
		jQuery Pagination Ajax分页插件中文详解 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxin ... 
- jQuery form插件使用详解
		点击打开: jquery选择器全解 jquery中的style样式操作 jquery中的DOM操作 jquery中的事件操作全解 jquery中的动画操作全解 jquery中ajax的应用 自定义jq ... 
- Maven 变量及常见插件配置详解
		Maven 的 pom.xml 常用 变量 插件 配置 详解 一.变量 - 自定义变量及内置变量 1. 自定义变量 <properties> <project.build.name& ... 
- JRebel插件使用详解(IDEA热部署)(Day_44)
		JRebel插件使用详解 简介 JRebel是一套JavaEE开发工具. Jrebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率. JRebel是一款JAVA虚拟机插件,它使得JAVA ... 
- [logstash-input-redis]插件使用详解
		Redis插件参数配置详解 最小化配置 input { redis { data_type => "list" #logstash redis插件工作方式 key => ... 
- [logstash-input-log4j]插件使用详解
		Log4j插件可以通过log4j.jar获取Java日志,搭配Log4j的SocketAppender和SocketHubAppender使用,常用于简单的集群日志汇总. 最小化的配置 input { ... 
- elk之[logstash-input-file]插件使用详解
		https://www.cnblogs.com/xing901022/p/4805586.html http://www.cnblogs.com/xing901022/p/4802822.html ... 
随机推荐
- addEventListener、attachEvent、cancelBubble兼容性随笔
			一.前言 1. element.addEventListener(eventType, handler, capture); (1)参数eventType是要注册句柄的事件类型名. (2)参数hand ... 
- Understanding ASP.NET MVC Filters and Attributes
			这篇文章把Asp.net MVC的filter介绍的很详细,值得收藏. http://www.dotnet-tricks.com/Tutorial/mvc/b11a280114-Understandi ... 
- 打造Ubuntu下Java开发环境
			一.了解JDK 不同的java软件和类库对jdk有不同要求,在了解如何安装Java之前,让我们快速地了解JRE.OpenJDK和Oracle JDK之间的不同之处. JRE(Java Runtime ... 
- AIX 文件 打包 与 压缩 tar gzip compress 的使用
			今天在Aix用tar -cvf 备份,打成tar包,占有硬盘空间过大,没有压缩比, 尝试使用tar -zcvf linux系统下可以用-z 命令 (z 用gzip来压缩/解压缩文件,加上该选项后可以 ... 
- Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse
			框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ... 
- 设计模式之美:Mediator(中介者)
			索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Mediator 模式结构样式代码. 意图 用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显式地相互引用,从而使其 ... 
- 【C语言学习】《C Primer Plus》第2章 C语言的概述
			学习总结 1.#include是C预处理命令之一,#include指向的是头文件,如#include <stdio.h>,这个stdio.h就是程序需要引用的C标准库之一.里面包含了pri ... 
- 代码规范、代码复审、PSP
			作业三: 代码规范.代码复审.PSP 代码规范 代码规范的重要性 一.规范的代码可以促进团队合作 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异.且不说会存 ... 
- node.js小结 2
			下载node安装npm什么的就不说了 入门总结 http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 进入node_HOM ... 
- jmap
			环境: 现有一个独立运行的系统S(有独立的jre,但是没jdk),现想通过jmap导出其内存堆栈信息.于是另外安装一个jdk.可是jdk的版本跟S系统的jre不能对应上.出了很多错误. 总是报错: C ... 
