我们在做日志处理时,往往会从多个源服务器收集日志,然后在一个(或一组)中心服务器做日志聚合分析。

源服务器上的日志可能属于同一应用类型,也可能属于不同应用类型。我们可能需要在聚合服务器上对这些不同类型的日志分类处理,一个实现方法就是在Fluentd内部重新给这些日志打tag,然后重新路由到合适的output插件进行输出。

rewrite_tag_filter就是一个提供这种给日志重新打tag的插件。需要说明的是,从其命名来看,rewrite_tag_filter是一个filter,而实际上它是一个output插件。因为Fluentd的filter插件并不允许重写tag。

  1. 基本原理

    rewrite_tag_filter可通过定义一系列的规则(rule)来实现日志的匹配和tag重写。

    这些规则会按照其定义顺序逐一对日志进行匹配,一旦日志符合某个规则,插件会使用该规则定义的方法重写日志的tag,并将重写后的日志事件再次发送到Fluentd路由中,从而实现对输入日志的分类处理。

举一个简单的例子:

# Configuration
<match app.component>
@type rewrite_tag_filter
<rule>
key message
pattern /^(w+)$/
tag $1.${tag}
</rule>
</match>

在这个例子中,日志的原tag为app.component。

rewrite_tag_filter会对日志记录的message字段进行匹配测试,pattern定义了匹配规则,这里是匹配message中的每个单词,然后去第一个单词,将其插入到原tag之前。

重写效果如下所示:

+------------------------------------------+        +------------------------------------------------+
| original record | | rewritten tag record |
|------------------------------------------| |------------------------------------------------|
| app.component {"message":"[info]: ..."} | +----> | info.app.component {"message":"[info]: ..."} |
| app.component {"message":"[warn]: ..."} | +----> | warn.app.component {"message":"[warn]: ..."} |
| app.component {"message":"[crit]: ..."} | +----> | crit.app.component {"message":"[crit]: ..."} |
| app.component {"message":"[alert]: ..."} | +----> | alert.app.component {"message":"[alert]: ..."} |
+------------------------------------------+ +------------------------------------------------+
  1. 安装说明

    td-agent v3.0.1或更高版本已经内置了rewrite_tag_filter。

    较低版本的td-agent可以通过以下命令进行安装:
# for td-agent2 (with fluentd v0.12)
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter -v 1.6.0 # for td-agent3 (with fluentd v0.14)
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter
  1. 配置示例

    一个好的配置设计原则是:先过滤掉不需要的日志,然后再处理需要重写的日志。
<source>
@type tail
path /var/log/httpd/access_log
<parse>
@type apache2
</parse>
tag td.apache.access
pos_file /var/log/td-agent/apache_access.pos
</source> <match td.apache.access>
@type rewrite_tag_filter
capitalize_regex_backreference yes
<rule>
key path
pattern /\.(gif|jpe?g|png|pdf|zip)$/
tag clear
</rule>
<rule>
key status
pattern /^200$/
tag clear
invert true
</rule>
<rule>
key domain
pattern /^.+\.com$/
tag clear
invert true
</rule>
<rule>
key domain
pattern /^maps\.example\.com$/
tag site.ExampleMaps
</rule>
<rule>
key domain
pattern /^news\.example\.com$/
tag site.ExampleNews
</rule>
# it is also supported regexp back reference.
<rule>
key domain
pattern /^(mail)\.(example)\.com$/
tag site.$2$1
</rule>
<rule>
key domain
pattern /.+/
tag site.unmatched
</rule>
</match> <match site.*>
@type mongo
host localhost
database apache_access
remove_tag_prefix site
tag_mapped
capped
capped_size 100m
</match> <match clear>
@type null
</match>

这个例子中,rewrite_tag_filter首先过滤掉了Apache中图片、压缩包等静态文件的请求日志,然后对日志中的path、status、domain这些字段依次进行正则匹配:

第二个rule用于匹配响应代码为200的记录,通过invert将非200的请求记录过滤掉;

第三个rule用于匹配.com结尾的域名,通过invert将非.com域名请求记录过滤掉;

第四五六个rule用于分类处理不同前缀的域名,分别重写其tag为site.ExampleMaps、site.ExampleNews、site.ExampleMail;

最后一个rule用于处理其他域名,统一重写tag为site.unmatched。

被过滤掉的日志,其tag被重写为clear,并最后丢弃(输出到null)。

其他被重写tag的日志会按照其tag名称被分别写入MongoDB的不同collections中。

  1. 参数说明
  • capitalize_regex_backreference 是否大写正则匹配后项引用项的首字母。默认false,不大写。
  • <rule>配置项 设置匹配及重写规则。

    key:指定日志记录中的匹配字段

    pattern:匹配规则使用的正则表达式

    tag:新的tag。

    支持正则表达式的后向引用,参加上例中第六个rule。

    支持以下占位符:

    • ${tag}__TAG__:原tag
    • ${tag_parts[n]}__TAG_PARTS[n]__:取原tag的第n个字段
    • ${hostname}__HOSTNAME__:主机名

      invert:默认为false。
    • true表示若匹配失败,则重写tag;
    • false表示匹配成功时才重写tag。

      占位符参数:

      • remove_tag_prefix:移除原tag中的前缀
      • remove_tag_regexp:移除原tag中的正则匹配部分
      • hostname_command:设置hostname使用的命令。

        默认使用hostname获取完整的主机名。

        可使用hostname -s获取较短的主机名。
  1. 场景举例
# built-in TCP input
<source>
@type forward
</source> # Filter record like mod_rewrite with fluent-plugin-rewrite-tag-filter
<match apache.access>
@type rewrite_tag_filter
<rule>
key status
pattern /^(?!404)$/
tag clear
</rule>
<rule>
key path
pattern /.+/
tag mongo.apache.access.error404
</rule>
</match> # Store deadlinks log into mongoDB
<match mongo.apache.access.error404>
@type mongo
host 10.100.1.30
database apache
collection deadlinks
capped
capped_size 50m
</match> # Clear tag
<match clear>
@type null
</match>

这个配置使用in_forward收集Apache的访问日志。通过设置两个rule,提取日志中的http 404请求记录,将这些请求的url写入MongoDB,这样就可以方便地统计网站中存在的死链。

  1. 常见问题

    使用rewrite_tag_filter经常遇到的情况是,重写tag导致日志无法输出。

    比如:
<match app.**>
@type rewrite_tag_filter
<rule>
key level
pattern /(.+)/
tag app.$1
</rule>
</match> <match app.**>
@type forward
# ...
</match>

这个片段就会导致日志无法输出。

仔细看重写规则可以发现,以app开头的tag被重写后仍然是以app为开头。这导致了新事件重新进入第一个<match>,发生了死循环。

所以重新tag时需要谨慎一些,避免发生此类情况。

21. Fluentd输出插件:rewrite_tag_filter用法详解的更多相关文章

  1. golang格式化输出-fmt包用法详解

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...

  2. 21.Python算术运算符及用法详解

    算术运算符是处理四则运算的符号,在数字的处理中应用得最多.Python 支持所有的基本算术运算符,如表 1 所示. 表 1 Python常用算术运算符 运算符 说明 实例 结果 + 加 12.45 + ...

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

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

  4. Vue1.0用法详解

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

  5. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...

  6. jQuery 事件用法详解

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

  7. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  8. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  9. JavaScript中return的用法详解

    JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...

随机推荐

  1. 10分钟带你进入Swagger的世界,快来看一看吧

    什么是Swagger? 如下引用swagger官方的解释 Swagger is a powerful yet easy-to-use suite of API developer tools for ...

  2. Solution -「线段树」题目集合

    T1 无聊的数列 来自:Link flag 帖先从水题入手. 首先分析题目,它是以等差数列为原型进行的修改.等差数列一大性质就是其差分数列的值除第一项以外均相等. 于是不难想到使用差分数列进行维护. ...

  3. logstash在windows系统下的安装与使用

    前言: Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到 Elasticsearch. ES官网:https://www.elastic.co/p ...

  4. 破坏正方形UVA1603

    题目大意 有一个由火柴棍组成的边长为n的正方形网格,每条边有n根火柴,共2n(n+1)根火柴.从上至下,从左到右给每个火柴编号,现在拿走一些火柴,问在剩下的后拆当中ongoing,至少还要拿走多少根火 ...

  5. css基础03

    就近原则执行粉色.而不是全覆盖,只有样式冲突的地方才会覆盖. 会执行粉色和12px.后来者居上 高度宽度内外边距这些不会继承. 子元素会继承行高, 1.5是行高是字体大小的1.5倍的意思. 有了!im ...

  6. MySQL sql优化(摘抄自文档)

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  7. mac下安装YII

    新换了台电脑,一个mac,特蛋疼的各种环境安装.两个多小时,总算把开发环境配好了. XAMPP就不用说了,phpstorm(javaEE 6.0),navicat for mysql ,一堆的注册码, ...

  8. 使用Python3将word文档和pdf电子书进行格式互转(兼容Windows/Linux)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_96 一些重要文档格式之间的互转在目前显得尤为重要,pdf作为通用格式在现在各个平台上兼容性是最好的,所以写python脚本将这些w ...

  9. Blazor和Vue对比学习(进阶2.2.4):状态管理之持久化保存(2),Cookie/Session/jwt

    注:本节涉及到前后端,这个系列的对比学习,还是专注在前端Vue和Blazor技术,所以就不撸码了,下面主要学习概念. 我们知道,Http是无状态协议,客户端请求服务端,认证一次后,如果再次请求,又要重 ...

  10. 发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows

    发布用于Windows的 .NET MAUI 应用 打开 PowerShell 终端 , 命令行进入工程目录,以我的例子工程为例, cd BlazorMaui BlazorMaui 替换为你自己工程名 ...