in_http插件允许使用HTTP协议来采集日志事件。这个插件会建立一个支持REST风格的HTTP端点,来接收日志事件请求。

  1. 配置示例
  1. <source>
  2. @type http
  3. port 9880
  4. bind 0.0.0.0
  5. body_size_limit 32m
  6. keepalive_timeout 10s
  7. </source>
  1. 基本用法

    如果已经建立了一个使用in_http插件的Fluentd节点,我们可以通过发送post请求向这个节点发送日志记录。比如:
  1. # Post a record with the tag "app.log"
  2. $ curl -X POST -d 'json={"foo":"bar"}' http://localhost:9880/app.log

这里,通过uri来指定日志事件的tag,通过post消息体来传递日志数据,其中"json="指明了日志的封装格式。

默认情况下,日志事件的时间戳字段会在in_http收到日志数据后被添加上。可以通过在url中指定time参数来设置时间戳。比如:

  1. # Overwrite the timestamp to 2018-02-16 04:40:37.3137116
  2. $ curl -X POST -d 'json={"foo":"bar"}' \
  3. http://localhost:9880/test.tag?time=1518756037.3137116

下边是另一个示例,使用js来发送日志记录。

  1. // Post a record using XMLHttpRequest
  2. var form = new FormData();
  3. form.set('json', JSON.stringify({"foo": "bar"}));
  4. var req = new XMLHttpRequest();
  5. req.open('POST', 'http://localhost:9880/debug.log');
  6. req.send(form);

我们可以看到,通过这种方式,任何基于HTTP的应用程序都可以使用Fluentd作为日志服务。

  1. 参数说明

    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的值。比如:
  1. X-Forwarded-For: host1, host2
  2. 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版本,该参数取值支持通配符*,以允许接收任何域名发来的请求。比如:
  1. <source>
  2. @type http
  3. port 9880
  4. cors_allow_origins ["*"]
  5. </source>
  • respond_with_empty_img 是否使用1×1大小的图片作为响应消息。默认使用空字符串作为响应消息。
  • <transport> 配置项 用于配置是否使用TLS传输。
  1. <transport tls>
  2. cert_path /path/to/fluentd.crt
  3. # other parameters
  4. </transport>
  • <parse>指令 设置用于解析输入日志的解析器插件。比如:
  1. <source>
  2. @type http
  3. port 9880
  4. <parse>
  5. @type regexp
  6. expression /^(?<field1>\d+):(?<field2>\w+)$/
  7. </parse>
  8. </source>

这里使用regexp来解析输入日志。相应的,POST消息体中的日志格式不再是json格式。

可以使用如下命令发送日志记录:

  1. # This will be parsed into {"field1":"123456","field2":"awesome"}
  2. $ curl -X POST -d '123456:awesome' http://localhost:9880/app.log
  1. 常见问题
  • 如何以MessagePack格式发送数据到in_http?

    可以在post消息体中增加"msgpack="前缀,来指明日志数据格式为MessagePack。比如:
  1. # Send data in msgpack format
  2. $ msgpack=`echo -e "\x81\xa3foo\xa3bar"`
  3. $ curl -X POST -d "msgpack=$msgpack" http://localhost:9880/app.log
  • 如何使用HTTP Content-Type消息头?

    in_http可以识别日志请求中的Content-Type消息头,从而识别日志的封装格式。

    比如,可以通过在HTTP消息头中指定Content-Type为json,来发送json格式的日志而不使用"json="前缀。
  1. $ curl -X POST -d '{"foo":"bar"}' -H 'Content-Type: application/json' http://localhost:9880/app.log

同样,也可以设置Content-Type为"application/msgpack"来发送MessagePack格式的日志。

  1. $ msgpack=`echo -e "\x81\xa3foo\xa3bar"`
  2. $ curl -X POST -d "$msgpack" -H 'Content-Type: application/msgpack' http://localhost:9880/app.log
  1. 性能优化
  • 使用批处理模式处理大量数据

    可以将多条日志组合为数组,通过一次HTTP请求发送到in_http接收节点

    比如:
  1. # Send multiple events as a JSON array
  2. $ 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来指定数据编码(压缩)方式。
  1. # Send gzip-compressed payload
  2. $ echo 'json={"foo":"bar"}' | gzip > json.gz
  3. $ curl --data-binary @json.gz -H "Content-Encoding: gzip" http://localhost:9880/app.log

仅此即可,不需要对Fluentd进行额外配置。

  • 多worker进程环境

    如果在多worker进程模式下使用in_http插件,这些worker进程将会监听相同的端口。
  1. <system>
  2. workers 3
  3. </system>
  4. <source>
  5. @type http
  6. port 9880
  7. </source>

这个配置中,3个worker进程会同时监听9880端口,输入数据会自动在worker进程间路由。

  1. 错误排查

    为何日志中的"+"号被in_http删除了?这是HTTP规范所致,并非Fluentd所为。

    应用程序需要使用合适的编码方式,或使用multipart请求,来避免这种情况。

比如,可以通过如下方式发送带"+"号的日志。

  1. # OK
  2. curl -X POST -H 'Content-Type: multipart/form-data' -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log
  3. # Bad
  4. curl -X POST -F 'json={"message":"foo+bar"}' http://localhost:9880/app.log

19. Fluentd输入插件:in_http用法详解的更多相关文章

  1. Vue插件编写、用法详解(附demo)

    Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...

  2. ZT --- extern "C"用法详解 2010-08-21 19:14:12

    extern "C"用法详解 2010-08-21 19:14:12 分类: C/C++ 1.前言: 时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus ...

  3. Vue1.0用法详解

    Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...

  4. jQuery 事件用法详解

    jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...

  5. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  6. linux curl用法详解

    linux ‍‍curl用法详解 ‍‍curl的应用方式,一是可以直接通过命令行工具,另一种是利用libcurl库做上层的开发.本篇主要总结一下命令行工具的http相关的应用, 尤其是http下载方面 ...

  7. python format 用法详解

    format 用法详解 不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 单个参数可以多次输出,参数顺序可以不相同 填充方式十分灵活,对齐方式十分强大 官方推荐用的方式,%方式将会在后面的版 ...

  8. Elasticsearch SQL用法详解

    Elasticsearch SQL用法详解  mp.weixin.qq.com 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子 ...

  9. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

随机推荐

  1. c++头文件的一个误导

    通常情况下,我们都认为c++的头文件是这样的: #include <bits/stdc++.h> using namespace std; int main() 但c++也可以用c的头文件 ...

  2. 3.Android高仿网易云音乐-首页复杂发现界面布局和功能/RecyclerView复杂布局

    0.效果图 效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单:然后是发现界面推荐单曲,点击单曲就是直接进入播放界面:最后是全局播放控制条上点击播放列表按钮显示的播放列表弹窗. 1.整 ...

  3. zabbix监控添加学习笔记

    在实际生产环境中,除了CPU.内存等一些系统信息可以挂载zabbix的自带模板Template OS Linux:但是一些公司开发的定制服务需要自己写模板或者监控项去监控: 一.监控公司的java服务 ...

  4. 转换流的原理和OutputStreamWriter介绍&代码实现

    转换流的原理 OutputStreamWriter介绍&代码实现 package com.yang.Test.ReverseStream; import java.io.FileNotFoun ...

  5. ArrayList的操作和对象数组

    ArrayList是List接口的一个实现类,它是程序中最常见的一种集合. ArrayList内部的数据存储结构时候数组形式,在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量 ...

  6. static关键字和代码块

    static关键字 static修饰的变量称为静态变量/共享变量/类变量 用于修饰类的成员,如成员变量.成员方法以及代码块等,内static修饰的成员具备一些特殊性 1.静态变量 在java类中使用s ...

  7. 使用flex弹性布局代替传统浮动布局来为微信小程序写自适应页面

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_109 我们知道,写习惯了前端的人,一般切图后布局页面的话,上手最习惯的是基于盒子模型的浮动布局,依赖 display 属性 + p ...

  8. 技术分享 | MySQL数据误删除的总结

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 内容提要 用delete语句 使用drop.truncate删除表以及drop删 ...

  9. 我分析30w条数据后发现,西安新房公摊最低的竟是这里?

    前两天一个邻居发出了灵魂质问:"为什么我买的180平和你的169平看上去一样大?" "因为咱俩的套内面积都是138平......" 我们去看房子,比较不同楼盘的 ...

  10. 在 Apache DolphinScheduler 上调试 LDAP 登录,亲测有效!

    点击上方 蓝字关注我们 作者 | 小钻风 01 背景 当看这边文章时,那得恭喜您终于找到宝藏,这是梦开始的地方-- 使用 Apache  DolphinScheduler 的小伙伴会遇到个挠脑袋的问题 ...