logstash的mutate过滤器的使用

一、背景

当我们使用logstash从外部读取到数据后,默认情况下读取到的值都是string的类型,假设我们这个时候需要修改字段值的类型,如果从string修改成integer,或者删除字段、修改字段的名字、给字段一个默认值等操作时,这个时候我们就可以借助 mutate filter 来实现。

二、需求

1、从文件中读取数据,文件中的数据符合csv的格式,即默认是以,分隔。

2、对读取到的字段进行 删除字段、修改字段的值、修改字段的类型、给一个默认值、字段合并等操作。

三、实现步骤

1、安装 csv codec 插件

注意️:

默认情况下,csv codec插件并没有安装,需要我们自己手动安装一下,执行如下命令bin/logstash-plugin install logstash-codec-csv

# 进入 logstash 的安装目录
cd /Users/huan/soft/elastic-stack/logstash/logstash
# 监测是否安装了 csv codec 插件
bin/logstash-plugin list --verbose
# 安装 csv 插件
bin/logstash-plugin install logstash-codec-csv

2、准备需要读取的文件数据

user_
real_name
user_
english_name
age address education strip_blank language default_value create_time
张三 zhangSan 20 湖北省;罗田县 学历-本科 去首尾空格 java 默认值 20210512 08:47:03
李四 lisi 18 湖北省;黄冈 学历-专科 去首 空格 C 20210512 03:12:20

3、编写 pipeline ,读取和输出数据

input {
file {
id => "mutate-id"
path => ["/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-mutate/mutate.csv"]
start_position => "beginning"
sincedb_path => "/Users/huan/soft/elastic-stack/logstash/logstash/pipeline.conf/filter-mutate/sincedb.db"
codec => csv {
columns => ["user_real_name","user_english_name","age","address","education","strip_blank","language","default_value","create_time"]
charset => "UTF-8"
separator => ","
skip_empty_columns => false
convert => {
"age" => "integer"
}
}
}
} output {
stdout {
codec => rubydebug { }
}
}
  • csv codec 插件解释

    • columns :定义一组解析后的csv的列名,也是后期的字段名
    • charset:字符编码
    • separator:定义读取到的一行数据,以什么作为分隔,csv文件一般是以,或tab等进行分隔,默认是逗号
    • skip_empty_columns:如果值为空,是否跳过空列。
      • true:跳过
      • false: 不跳过
    • convert:数据类型转换,默认读取到的值的类型都是string,此处将 age字段的值的数据类型转换成了integer

4、mutate 插件的使用

前置条件:

1、如无特殊说明,测试数据的数据为 实现步骤>准备需要读取的文件数据 中的数据

注意事项:

1、updatereplace都是更新字段的值,但是如果update更新的字段的值不存在,那么没有效果,但是replace会新增加这个字段。

2、copy字段的目标值,如果存在则覆盖值,否则新增加一个字段。

1、coerce 给字段设置默认值

如果某个字段已经存在,并且它的值是null,那么我们可以使用coerce来为它设置默认值

1、配置文件的写法

filter {
mutate {
coerce => {
"default_value" => "该字段没有值,设置一个默认值"
}
}
}

2、执行结果

2、rename 给字段重命名

1、配置文件的写法

filter {
mutate {
rename => {
"user_real_name" => "[user][real_name]"
"user_english_name" => "[user][english_name]"
"age" => "年龄"
}
}
}

2、执行结果

3、update 更新字段的值

1、配置文件的写法

filter {
mutate {
# 1、更新字段的值
update => {
"user_address" => "用户的地址是: %{address}"
}
}
}

2、执行结果

3、解释

update进行更新值,更新的字段必须要存在,否则没有任何效果。

4、replace 更新字段的值

1、配置文件的写法

filter {
mutate {
# 1、更新字段的值
replace => {
"user_address" => "用户的地址是: %{address}"
}
}
}

2、执行结果

5、convert 数据类型转换

1、可以转换的数据类型

integer、integer_eu、float、float_eu、string、boolean

2、配置文件的写法

filter {
mutate {
# 1、数据类型转换
convert => {
"age" => "string"
}
}
}

3、执行结果

6、gsub 对字段内容进行替换

1、配置文件的写法

filter {
mutate {
# 1、替换字段的内容, 第二个参数可以写正则表达式 ,替换的字段 只能是 string 类型或者 string类型的数组
gsub => [
"address", ";", "--"
]
}
}

2、执行结果

7、uppercase、capitalize、lowercase 大写、首字母大写、小写

1、配置文件的写法

filter {
mutate {
# 1.1 大写
uppercase => ["language"]
# 2.2 小写
# lowercase => ["user_english_name"]
# 3.3 首字母大写
capitalize => ["user_english_name"]
}
}

需要注意优先级。

2、执行结果

8、strip 去除首尾空格

1、配置文件的写法

filter {
mutate {
# 去除首尾空格
strip => ["strip_blank"]
}
}

2、执行结果

9、remove 移除字段

1、配置文件的写法

filter {
mutate {
# 移除字段 ,如果 Event 中 username 的值是 zhangsan ,那么会移除字段名是 foo_zhangsan 这个字段。
remove_field => ["user_real_name","foo_%{username}"]
}
}

2、执行结果

10、split 切割字段

1、配置文件的写法

filter {
mutate {
# 1、切割字段
split => {
"address" => ";"
}
}
}

2、执行结果

11、 join 连接字段

1、配置文件的写法

filter {
mutate {
# 1、切割字段
split => {
"address" => ";"
} # 2、连接字段
join => {
"address" => "***"
}
}
}

先使用 split 切割成数组,然后使用 join 连接

2、执行结果

12、merge 字段合并

1、可以合并的情况

`array` + `string` will work
`string` + `string` will result in an 2 entry array in `dest_field`
`array` and `hash` will not work

2、配置文件的写法

filter {
mutate {
# 1、字段合并
merge => {
"user_real_name" => "user_english_name"
}
}
}

3、执行结果

13、copy 复制字段

1、配置文件的写法

filter {
mutate {
# 1、字段复制, 如果 user_name 这个字段已经存在了,那么此字段的值会被覆盖,否则新增一个字段的值
copy => {
"user_real_name" => "user_name"
}
}
}

2、执行结果

四、mutate的优先级

1、mutate 在配置文件中的执行顺序

coerce、rename、update、replace、convert、gsub、uppercase、capitalize、lowercase、strip、remove、split、join merge、copy

corece最先执行,copy最后执行。

2、多个mutate块的优先级

filter {
# mutate块1 会比 下方的 mutate2 先执行
mutate {}
# mutate块2
mutate {}
}

注意️:

假设 我们需要字段 age先复制copy一下,然后在转换一下数据类型convert,那么可以使用上方的 多个 mutate 块来执行。

1、配置文件的写法

filter {
# 测试多 mutate 块的优先级
mutate {
copy => {
"age" => "new_age"
}
}
mutate {
convert => {
"age" => "string"
}
}
}

将 convert 和 copy 放置在一个 mutate 块中会发现结果不一样。

2、执行结果

五、参考文档

1、https://www.elastic.co/guide/en/logstash/7.12/working-with-plugins.html

2、https://www.elastic.co/guide/en/logstash/current/plugins-codecs-csv.html

3、https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html

logstash的mutate过滤器的使用的更多相关文章

  1. Elastic Stack之Logstash进阶

    Elastic Stack之Logstash进阶 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用GeoLite2和logstash 过滤插件的geoip案例 1>. ...

  2. Logstash 算术运算操作

    需求:input为json,output为ES,需使用filter提取json中的某个字段,并执行加法.加法.乘法等算法操作 思路:mutate过滤器+ruby过滤器实现 避坑:根据ES及Logsta ...

  3. Logstash的filter插件介绍

    一 官网说明 过滤器插件对事件执行中介处理.通常根据事件的特征有条件地应用过滤器. 以下过滤器插件在下面可用. Plugin Description Github repository aggrega ...

  4. ELK学习实验012:Logstash的安装和使用

    一 logstash安装 1.1下载包 [root@node1 ~]# cd /usr/local/src/ [root@node1 src]# wget https://artifacts.elas ...

  5. logstash multiline

    filter { multiline { pattern => "^\s+%{TIMESTAMP_ISO8601}" negate=>true what=>&qu ...

  6. ElastAlert监控日志告警Web攻击行为

    由于公司需要监控web攻击行为,而因某些原因搭不了waf,才不得不用ElastAlert进行告警,此为前提. 一.ELK安装 Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎 ...

  7. filter-mutate过滤插件

    之前的nginx日志使用grok匹配,但是后来发现nginx的日志中每个值之间都使用了分隔符"|",这下就可以使用mutate来分隔出每个字段的含义,同时还减少了运算. 描述 mu ...

  8. AWS上的EFK环境部署

    1.准备工作及组件 本章使用自建服务以及aws服务来配置使用. 服务 版本 作用 filebeat 6.7.2→ 7.3.1 节点日志收集,只完成少量比如多行合并工作 logstash 6.4.2→7 ...

  9. 【7.1.1】ELK日志系统单体搭建

    ELK是什么? 一般来说,为了提高服务可用性,服务器需要部署多个实例,每个实例都是负载均衡转发的后的,如果还用老办法登录服务器去tail -f xxx.log,有很大可能错误日志未出现在当前服务器中, ...

随机推荐

  1. MyBatis的多表查询笔记

    MyBatis的多表查询 随着学习的进步,需求的提高,我们在实际开发中用的最多的还是多表查询,就让我们一起学习MyBatis中的多表查询. 数据库准备 Class表 Student表 项目结构 这次使 ...

  2. zip命令常用选项

    大家都知道,在linux上一切皆文件,在实际生产环境中,如果我们需要部署一些系统的服务,我们会将一些软件包提前下载下来统一放到一个文件夹中, 然后将部署的过程用shell或者python写成一个脚本, ...

  3. 安装docker遇到:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    执行 yum install docker-ce docker-ce-cli containerd.io 提示: 错误: 问题: package docker-ce-3:19.03.8-3.el7.x ...

  4. easyx实现小球移动

    easyx是一个针对VC++编译器的图形化插件.使用它,可以使得在C++中编写图形程序. 小球移动代码: #include"stdafx.h" #include<graphi ...

  5. Git(1) - Git、Github和Gitlab简介

    Git是什么 概念 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. SVN.CVS等,它们是集中式版本控制系统. 集中式和分布式版本控制 ...

  6. Appium driver常用API

    click driver.find_element implicitly_wait send_keys close quit get_window_size switch_to execute bac ...

  7. 关于Python中的深浅拷贝

    之前一直认为浅拷贝是拷贝内容的第一层,但是不开辟内存,只是增加新的指向原来的内容:深拷贝是拷贝是拷贝每一层并开辟内存. 其实这个是不严谨的不正确的. 从以上可以看出,浅拷贝中当时可变类型的时候,内存是 ...

  8. 关于python中的可哈希与不可哈希

    可哈希:简要的说可哈希的数据类型,即不可变的数据结构(字符串str.元组tuple.对象集objects).它是一个将大体量数据转化为很小数据的过程,甚至可以仅仅是一个数字,以便我们可以用在固定的时间 ...

  9. 用Fiddler抓不到https的包?因为你姿势不对!往这看!

    前言 刚入行测试的小伙伴可能不知道,Fiddler默认抓http的包,如果要抓https的包,是需要装证书的!什么鬼证书?不明白的话继续往下看. Fiddler 抓取 https 数据 第一步:下载 ...

  10. vue-混入( mixin 更方便的组件功能复用方法)的使用

    前言 vue 中组件完成了样式和功能的综合复用,通过自定义指令完成了一部分功能的复用,本文总结一下混入在vue项目开发中提供的非常便利的功能复用. 正文 1.混入的分类 (1)全局混入 <div ...