19. Fluentd输入插件:in_http用法详解
in_http插件允许使用HTTP协议来采集日志事件。这个插件会建立一个支持REST风格的HTTP端点,来接收日志事件请求。
- 配置示例
<source>
@type http
port 9880
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 10s
</source>
- 基本用法
如果已经建立了一个使用in_http插件的Fluentd节点,我们可以通过发送post请求向这个节点发送日志记录。比如:
# Post a record with the tag "app.log"
$ curl -X POST -d 'json={"foo":"bar"}' http://localhost:9880/app.log
这里,通过uri来指定日志事件的tag,通过post消息体来传递日志数据,其中"json="指明了日志的封装格式。
默认情况下,日志事件的时间戳字段会在in_http收到日志数据后被添加上。可以通过在url中指定time参数来设置时间戳。比如:
# Overwrite the timestamp to 2018-02-16 04:40:37.3137116
$ curl -X POST -d 'json={"foo":"bar"}' \
http://localhost:9880/test.tag?time=1518756037.3137116
下边是另一个示例,使用js来发送日志记录。
// Post a record using XMLHttpRequest
var form = new FormData();
form.set('json', JSON.stringify({"foo": "bar"}));
var req = new XMLHttpRequest();
req.open('POST', 'http://localhost:9880/debug.log');
req.send(form);
我们可以看到,通过这种方式,任何基于HTTP的应用程序都可以使用Fluentd作为日志服务。
- 参数说明
in_http支持通用参数。还支持以下参数:
- @type插件类型,取值为http。
- port监听端口,默认为9880.
- bind监听的网卡地址,默认为0.0.0.0,监听所有网卡。
- body_size_limit POST消息体(即日志数据)最大字节数,默认为32MB。
- keepalive_timeout HTTP keepalive超时时长,默认为10秒。
- add_http_headers是否向日志记录中添加HTTP_为前缀的头部信息,默认不添加。
- add_remote_addr是否向日志记录中添加REMOTE_ADDR字段,默认不添加。
如果添加,该字段的值为客户端的ip地址。如果HTTP请求头部中设置了多个X-Forwarded-For字段,in_http采用第一个X-Forwarded-For的值作为REMOTE_ADDR的值。比如:
X-Forwarded-For: host1, host2
X-Forwarded-For: host3
这个HTTP请求头包含了3个X-Forwarded-For,in_http取host1作为REMOTE_ADDR的值。
- cors_allow_origins设置CORS域名白名单,默认不可跨域。
如果设置白名单,其值为一个数组,比如["domain1", "domain2"]。
对于白名单之外的域名,in_http会返回403错误。从Fluentd v1.2.6版本,该参数取值支持通配符*,以允许接收任何域名发来的请求。比如:
<source>
@type http
port 9880
cors_allow_origins ["*"]
</source>
- respond_with_empty_img 是否使用1×1大小的图片作为响应消息。默认使用空字符串作为响应消息。
<transport>配置项 用于配置是否使用TLS传输。
<transport tls>
cert_path /path/to/fluentd.crt
# other parameters
</transport>
<parse>指令 设置用于解析输入日志的解析器插件。比如:
<source>
@type http
port 9880
<parse>
@type regexp
expression /^(?<field1>\d+):(?<field2>\w+)$/
</parse>
</source>
这里使用regexp来解析输入日志。相应的,POST消息体中的日志格式不再是json格式。
可以使用如下命令发送日志记录:
# This will be parsed into {"field1":"123456","field2":"awesome"}
$ curl -X POST -d '123456:awesome' http://localhost:9880/app.log
- 常见问题
- 如何以MessagePack格式发送数据到in_http?
可以在post消息体中增加"msgpack="前缀,来指明日志数据格式为MessagePack。比如:
# Send data in msgpack format
$ msgpack=`echo -e "\x81\xa3foo\xa3bar"`
$ curl -X POST -d "msgpack=$msgpack" http://localhost:9880/app.log
- 如何使用HTTP Content-Type消息头?
in_http可以识别日志请求中的Content-Type消息头,从而识别日志的封装格式。
比如,可以通过在HTTP消息头中指定Content-Type为json,来发送json格式的日志而不使用"json="前缀。
$ curl -X POST -d '{"foo":"bar"}' -H 'Content-Type: application/json' http://localhost:9880/app.log
同样,也可以设置Content-Type为"application/msgpack"来发送MessagePack格式的日志。
$ msgpack=`echo -e "\x81\xa3foo\xa3bar"`
$ curl -X POST -d "$msgpack" -H 'Content-Type: application/msgpack' http://localhost:9880/app.log
- 性能优化
- 使用批处理模式处理大量数据
可以将多条日志组合为数组,通过一次HTTP请求发送到in_http接收节点
比如:
# Send multiple events as a JSON array
$ curl -X POST -d 'json=[{"foo":"bar"},{"abc":"def"},{"xyz":"123"}]' http://localhost:9880/app.log
这样通过减少HTTP请求次数提高系统的吞吐量。
- 压缩数据以减少带宽占用
从v1.2.3开始,Fluentd支持处理gzip格式的压缩数据。
可以在HTTP消息头中通过Content-Encoding来指定数据编码(压缩)方式。
# Send gzip-compressed payload
$ echo 'json={"foo":"bar"}' | gzip > json.gz
$ curl --data-binary @json.gz -H "Content-Encoding: gzip" http://localhost:9880/app.log
仅此即可,不需要对Fluentd进行额外配置。
- 多worker进程环境
如果在多worker进程模式下使用in_http插件,这些worker进程将会监听相同的端口。
<system>
workers 3
</system>
<source>
@type http
port 9880
</source>
这个配置中,3个worker进程会同时监听9880端口,输入数据会自动在worker进程间路由。
- 错误排查
为何日志中的"+"号被in_http删除了?这是HTTP规范所致,并非Fluentd所为。
应用程序需要使用合适的编码方式,或使用multipart请求,来避免这种情况。
比如,可以通过如下方式发送带"+"号的日志。
# OK
curl -X POST -H 'Content-Type: multipart/form-data' -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log
# Bad
curl -X POST -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log
19. Fluentd输入插件:in_http用法详解的更多相关文章
- Vue插件编写、用法详解(附demo)
Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...
- ZT --- extern "C"用法详解 2010-08-21 19:14:12
extern "C"用法详解 2010-08-21 19:14:12 分类: C/C++ 1.前言: 时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus ...
- Vue1.0用法详解
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...
- jQuery 事件用法详解
jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...
- Ubuntu kill命令用法详解
转自:Ubuntu kill命令用法详解 1. kill 作用:根据进程号杀死进程 用法: kill [信号代码] 进程ID root@fcola:/# ps -ef | grep sen ...
- linux curl用法详解
linux curl用法详解 curl的应用方式,一是可以直接通过命令行工具,另一种是利用libcurl库做上层的开发.本篇主要总结一下命令行工具的http相关的应用, 尤其是http下载方面 ...
- python format 用法详解
format 用法详解 不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 单个参数可以多次输出,参数顺序可以不相同 填充方式十分灵活,对齐方式十分强大 官方推荐用的方式,%方式将会在后面的版 ...
- Elasticsearch SQL用法详解
Elasticsearch SQL用法详解 mp.weixin.qq.com 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
随机推荐
- 5-4 Seata 分布式事务管理
下载Seata https://github.com/seata/seata/releases https://github.com/seata/seata/releases/download/v1. ...
- 全民开发!仓库管理者用无代码平台,搭建理想的WMS软件
货在哪儿? 我说过仓库管理不要依赖"老人",因为只有"他"知道货在哪怎么行?也不要完全依赖"系统",因为当前的"系统"并 ...
- 日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)
Linux日志收集 一.实验目的: 1.掌握rsyslog配置方法 2.配置rsyslog服务收集其他Linux服务器日志: C/S架构:客户端将其日志上传到服务器端,通过对服务器端日志的查询,来实现 ...
- 分享一个WPF 实现 Windows 软件快捷小工具
分享一个WPF 实现 Windows 软件快捷小工具 Windows 软件快捷小工具 作者:WPFDevelopersOrg 原文链接:https://github.com/WPFDevelopers ...
- k8s QoS与pod驱逐
概述 QoS是Quality of Service的缩写,即服务质量.每个pod属于某一个QoS分类,而Kubernetes会根据pod的QoS级别来决定pod的调度.抢占调度和驱逐优先级,而且pod ...
- ETCD快速入门-01 ETCD概述
1.ETCD概述 1.1 ETCD概述 etcd是一个高可用的分布式的键值对存储系统,常用做配置共享和服务发现.由CoreOS公司发起的一个开源项目,受到ZooKeeper与doozer启发而 ...
- 正则表达式实战:最新豆瓣top250爬虫超详细教程
检查网页源代码 首先让我们来检查豆瓣top250的源代码,一切网页爬虫都需要从这里开始.F12打开开发者模式,在元素(element)页面通过Ctrl+F直接搜索你想要爬取的内容,然后就可以开始编写正 ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- 我用Axure制作了一款火影小游戏 | PM老猫
Axure不仅仅是一个原型工具,除了原型之外还可以用来制作一些静态网页,这点对于不懂代码或前端的同学来说挺实用.之前整理了一版<Axure函数自查表>,因为感觉内容太多又对前端样式及脚本感 ...
- [SDOI2017]序列计数 (矩阵加速,小容斥)
题面 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希望,这n个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求 ...