首页 > 其他分享 >ELK系列(5) - Logstash怎么分割字符串并添加新的字段到Elasticsearch

ELK系列(5) - Logstash怎么分割字符串并添加新的字段到Elasticsearch

时间:2023-02-02 11:34:42浏览次数:68  
标签:ELK filter temp2 temp1 Elasticsearch key message Logstash


问题

有时候我们想要在Logstash里对收集到的日志等信息进行分割,并且将分割后的字符作为新的字符来index到Elasticsearch里。假定需求如下:

Logstash收集到的日志字段​​message​​​的值是由多个字段拼接而成的,分隔符是​​;,;​​,如下:

{
"message": "key_1=value_1;,;key_2=value_2"
}

现在想要将​​message​​的值拆分成2个新的字段:key_1、key_2,并且将它们index到ES里,可以借助Logstash的filter的插件来完成;这里提供两种解决方案。

方案一:使用mutate插件

filter {
mutate {
split => ["message",";,;"]
}

if [message][0] {
mutate {
add_field => {
"temp1" => "%{[message][0]}"
}
}
}

if [message][1] {
mutate {
add_field => {
"temp2" => "%{[message][1]}"
}
}
}

if [temp1][1] {
mutate {
split => ["temp1","="]
add_field => {
"%{[temp1][0]}" => "%{[temp1][1]}"
}
}
}

if [temp2][1] {
mutate {
split => ["temp2","="]
add_field => {
"%{[temp2][0]}" => "%{[temp2][1]}"
}
remove_field => [ "temp1", "temp2", "message" ]
}
}
}

看得出来,这种做法很麻烦,也不利于日后的维护。每当​​message​​里被拼接的字段的数量增加时,就必须同步改动这里的filter逻辑,而且添加的代码量也是呈线性递增的。

此外,这里使用的诸如​​temp1​​​等临时变量,可以用​​[@metadata][temp1]​​的写法来作为临时变量,这样就不需要去手动remove掉了。

方案二:使用ruby插件

filter {
ruby {
code => "
array1 = event.get('message').split(';,;')
array1.each do |temp1|
if temp1.nil? then
next
end
array2 = temp1.split('=')
key = array2[0]
value = array2[1]
if key.nil? then
next
end
event.set(key, value)
end
"
remove_field => [ "message" ]
}
}

ruby插件可以允许你使用ruby的语法来完成各种复杂的逻辑,使用这种方案可以完美解决方案一中的不足之处,便于日后的维护。

参考链接



标签:ELK,filter,temp2,temp1,Elasticsearch,key,message,Logstash
From: https://blog.51cto.com/u_15951177/6033420

相关文章

  • ELK系列(4) - Elasticsearch cannot write xcontent for unknown value of type class
    问题与分析在使用Elasticsearch进行index数据时,发现报错如下:java.lang.IllegalArgumentException:cannotwritexcontentforunknownvalueoftypeclassjava.math.BigD......
  • ELK系列(2) - Kibana怎么修改日期格式Date format
    问题Kibana在创建​​IndexPatterns​​​的时候,可以选择某个date类型的field作为排序字段。之后在​​Discover​​里打开对应的index,会发现这个date类型的field的格式显......
  • ELK系列(3) - Elasticsearch修改jvm参数
    方法Elasticsearch默认会配置1G的JVM堆的初始值和最大值,该jvm参数被配置在​​/config/jvm.options​​里:-Xms1g-Xmx1g如果只是个人开发小项目,可以把参数改小些,比如:-Xms512m......
  • ELK系列(7) - 测试环境下Logstash异常退出:block in multi_receive_encoded
    问题与分析在本地测试无误后将ELK部署到了测试环境,结果第二天发现Logstash挂掉了,一开始以为是自动部署之类导致的问题。之后几天时间里Logstash总是会down掉,查看了下日志文......
  • elasticsearch中使用runtime fields
    1、背景在我们使用es的开发过程中可能会遇到这么一种情况,比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型,但是后期发现需要使用这个字段来进行聚......
  • elasticsearch中使用runtime fields
    1、背景在我们使用es的开发过程中可能会遇到这么一种情况,比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型,但是后期发现需要使用这个字段来进行聚......
  • linux 安装 elasticsearch
    下载#注意下载版本cd/usr/local/srcwgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.tar.gz2、安装cd/usr/local/srctar-xvfelastics......
  • ElasticSearch实践分享
     背景介绍最近在做一个采购商城搜索的功能,核心功能是根据用户录入的关键字在商品库中根据全称匹配进行检索得到结果方案比较目标在不超过100万的数据集合中,根......
  • ElasticSearch 学习笔记
    ElasticSearch基础知识索引index一个索引就是一个拥有几分相似特征的文档的集合。索引就类似于关系型数据库中的库的概念。类型type一个类型是索引中的一......
  • Logstash grok 配置
    #SampleLogstashconfigurationforcreatingasimple#Beats->Logstash->Elasticsearchpipeline.#input{#beats{#port=>5044#codec=>json#......