[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 ...
随机推荐
- SQL Saturday活动再起
SQL Saturday活动再起 时间:2015年05月09日(星期六) 地点:上海徐汇区港汇2座10楼(10.073) 我们相约港汇2座10楼(10.073),SQL PASS上海分会的SQLSat ...
- [后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs
一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来打造一个单页面程序,后面一篇文章将介绍如何使用AngularJs的开发一个单页面应用 ...
- Java多线程19:定时器Timer
前言 定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单.定时更新某些缓存.定时清理一批不活跃用户等等.定时计划任务功能在Java中主要使用的就是Tim ...
- 有shi以来最详细的正则表达式入门教程
本篇文章文字内容较多,但是要学习正则就必须耐心读下去,正则表达式是正则表达式其实并没有想像中的那么困难,但是想要熟练的掌握它,还是需要下功夫勤加练习的.这里讲一些正则表达式的语法和学习方法,大家还要多 ...
- 根据BOM和已存在的文件生成文件列表
在BOM中记录中有物料编码,物料名称,物料规格等,而且依据BOM已经生成了相应的文件,如采购规格书,检验规格书等,这个时候需要获得这些文件的标题,并且生成一个列表,可以使用下面的VBA代码,具体代码如 ...
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
- 跟我一起云计算(1)——storm
概述 最近要做一个实时分析的项目,所以需要深入一下storm. 为什么storm 综合下来,有以下几点: 1. 生逢其时 MapReduce 计算模型打开了分布式计算的另一扇大门,极大的降低了实现分布 ...
- redis系列-redis的使用场景
redis越来越受大家欢迎,提升下速度,做下缓存,完成KPI之利器呀.翻译一篇文章<<How to take advantage of Redis just adding it to yo ...
- Git学习笔记(6)——Bug和Feature分支
本文主要记录了通过Git来调试Bug和添加新的功能,也就是Bug分支和Feature分支,以及分支的推送. Bug分支 通过Git,我们可以为每个Bug建立一个分支,Bug修复后,合并分支,然后将临时 ...
- MVVM架构~knockoutjs系列之级联select
返回目录 对于下拉列表框的绑定在之前的knockoutjs文章中已经介绍过,今天主要说一下级联的select,事实上,在knockoutjs里,是以数据绑定为中心的,而数据是以面向对象为前提的,而对于 ...