插件介绍

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. addEventListener、attachEvent、cancelBubble兼容性随笔

    一.前言 1. element.addEventListener(eventType, handler, capture); (1)参数eventType是要注册句柄的事件类型名. (2)参数hand ...

  2. Understanding ASP.NET MVC Filters and Attributes

    这篇文章把Asp.net MVC的filter介绍的很详细,值得收藏. http://www.dotnet-tricks.com/Tutorial/mvc/b11a280114-Understandi ...

  3. 打造Ubuntu下Java开发环境

    一.了解JDK 不同的java软件和类库对jdk有不同要求,在了解如何安装Java之前,让我们快速地了解JRE.OpenJDK和Oracle JDK之间的不同之处. JRE(Java Runtime ...

  4. AIX 文件 打包 与 压缩 tar gzip compress 的使用

    今天在Aix用tar -cvf 备份,打成tar包,占有硬盘空间过大,没有压缩比, 尝试使用tar -zcvf  linux系统下可以用-z 命令 (z 用gzip来压缩/解压缩文件,加上该选项后可以 ...

  5. Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse

    框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...

  6. 设计模式之美:Mediator(中介者)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Mediator 模式结构样式代码. 意图 用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显式地相互引用,从而使其 ...

  7. 【C语言学习】《C Primer Plus》第2章 C语言的概述

    学习总结 1.#include是C预处理命令之一,#include指向的是头文件,如#include <stdio.h>,这个stdio.h就是程序需要引用的C标准库之一.里面包含了pri ...

  8. 代码规范、代码复审、PSP

    作业三: 代码规范.代码复审.PSP 代码规范 代码规范的重要性 一.规范的代码可以促进团队合作  一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码必定会风格迥异.且不说会存 ...

  9. node.js小结 2

    下载node安装npm什么的就不说了 入门总结 http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 进入node_HOM ...

  10. jmap

    环境: 现有一个独立运行的系统S(有独立的jre,但是没jdk),现想通过jmap导出其内存堆栈信息.于是另外安装一个jdk.可是jdk的版本跟S系统的jre不能对应上.出了很多错误. 总是报错: C ...