前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Fluentd输出插件:out_elasticsearch用法详解

Fluentd输出插件:out_elasticsearch用法详解

作者头像
Fluentd中文网
发布2020-12-22 09:49:02
2.1K0
发布2020-12-22 09:49:02
举报
文章被收录于专栏:Fluentd学习交流Fluentd学习交流

把日志输出到elasticsearch做业务分析,这大概是最普遍的日志采集用途了

out_elasticsearch 输出插件用于将日志记录写入elasticsearch。


缺省情况下,它使用的是 elasticsearch 的 bulk api,这表示out_elasticsearch会在单次 api 调用中同时操作 elasticsearch 上的多个索引。

这样做的好处是可以减少系统资源调用,显著提升索引速度。

同时也意味着,如果你首次使用这个插件输出日志,日志不会立即被推送到 elasticsearch。

当<buffer>指令中 chunk_keys 设置的条件达到时,日志记录将会被发送到 elasticsearch。

可以通过设置 chunk_keys 中的 time 和 time_key 参数来调整插件输出日志的频率。

chunk_key 的设置请参考:Fluentd配置:缓存(Buffer)配置项


【安装方法】

如果你使用的是 td-agent v3.0.1及更高版本,out_elasticsearch 插件已打包在 td-agent 的安装包中,无需手动安装。

如果不是通过 td-agent 安装的 Fluentd,可使用 fluent-gem 来安装 out-elasticsearch。

代码语言:javascript
复制
$ fluent-gem install fluent-plugin-elasticsearch

【配置示例】

此处给出一个极简的配置片段,能满足大多数用户上手使用。

代码语言:javascript
复制
<match my.logs>
  @type elasticsearch
  host localhost
  port 9200
  logstash_format true
</match>

【插件参数】

@type

host

port

hosts

代码语言:javascript
复制
hosts host1:port1,host2:port2,host3:port3
# or
hosts https://customhost.com:443/path,https://username:password@host-failover.com:443

user, password

代码语言:javascript
复制
user fluent
password mysecret

schema

index_name

此参数支持使用占位符。

代码语言:javascript
复制
index_name fluentd.${tag}
代码语言:javascript
复制
index_name fluentd.${tag}.%Y%m%d
代码语言:javascript
复制
<buffer tag, time>
  timekey 1h # chunks per hours ("3600" also available)
</buffer>

logstash_format

缺省为 false,不使用。

logstash_prefix


【其他杂项】

可使用 %{} 格式的占位符来转义需要进行 URL 编码的字符。

以下为合法配置:

代码语言:javascript
复制
user %{demo+}
password %{@secret}
代码语言:javascript
复制
hosts https://%{j+hn}:%{passw@rd}@host1:443/elastic/,http://host2

以下为非法配置:

代码语言:javascript
复制
user demo+
password @secret

【常见问题】

无法向 elasticsearch 发送日志事件

比如,当前的 td-agent 绑定的是 6.x 系列的 elasticsearch-ruby 库,这意味着你的 elasticsearch 服务器的版本也应该是 6.x 。

代码语言:javascript
复制
# For td-agent users
$ /usr/sbin/td-agent-gem list elasticsearch
# For standalone Fluentd users
$ fluent-gem list elasticsearch
代码语言:javascript
复制
validate_client_version true
代码语言:javascript
复制
Detected ES 5 but you use ES client 6.1.0.
Please consider to use 5.x series ES client.

无法看到详细的失败日志

由于历史原因,out_elasticsearch 配置的 ssl_version 是 TLSv1,而现代 elasticsearch 生态要求 TLSv1.2或更高版本。

可通过以下配置开启传输日志:

这样,你就会看到如下的失败日志:

这种情况也会发生在使用了反向代理的场景中。


为何非法日志总是被无限重复处理?

代码语言:javascript
复制
<match **>
  @type elasticsearch
  host localhost
  port 9200
  type_name fluentd
  logstash_format true
  time_key @timestamp
  include_timestamp true
  reconnect_on_error true
  reload_on_failure true
  reload_connections false
  request_timeout 120s
</match>

如果使用泛型匹配,则错误日志会被重新提交到 out_elasticsearch 插件的处理流程中,不断重复,造成洪泛现象。

代码语言:javascript
复制
2018-11-13 11:16:27 +0000 [warn]: #0 dump an error event: error_class=Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError error="400 - Rejected by Elasticsearch" location=nil tag="app.fluentcat" time=2018-11-13 11:16:17.492985640 +0000 record={"message"=>"\xFF\xAD"}
2018-11-13 11:16:38 +0000 [warn]: #0 dump an error event: error_class=Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError error="400 - Rejected by Elasticsearch" location=nil tag="fluent.warn" time=2018-11-13 11:16:27.978851140 +0000 record={"error"=>"#<Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError: 400 - Rejected by Elasticsearch>", "location"=>nil, "tag"=>"app.fluentcat", "time"=>2018-11-13 11:16:17.492985640 +0000, "record"=>{"message"=>"\xFF\xAD"}, "message"=>"dump an error event: error_class=Fluent::Plugin::ElasticsearchErrorHandler::ElasticsearchError error=\"400 - Rejected by Elasticsearch\" location=nil tag=\"app.fluentcat\" time=2018-11-13 11:16:17.492985640 +0000 record={\"message\"=>\"\\xFF\\xAD\"}"}

我们可以通过以下两种方法解决这个问题:

代码语言:javascript
复制
<match out.elasticsearch.**>
  @type elasticsearch
  host localhost
  port 9200
  type_name fluentd
  logstash_format true
  time_key @timestamp
  include_timestamp true
  reconnect_on_error true
  reload_on_failure true
  reload_connections false
  request_timeout 120s
</match>

2,使用 @label 进行事件路由


out_elasticsearch 插件支持很多配置参数,本文只是介绍了其中几个。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Fluentd学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档