elasticsearch:dissect和grok处理器之间的区别(代码片段)

中国社区官方博客 中国社区官方博客     2023-01-09     468

关键词:

针对很多情况我们可以直接使用 Dissect 处理器来对非结构化化的日志进行结构化。在我之前的文章 “Elasticsearch:深入理解 Dissect ingest processor” 有做笔记深入的讲解。在很多的情况下,我们也可以使用 Grok  处理器来进行结构化。那么这两者之间有什么区别呢?在实际的使用中,我们到底首先哪一个呢?

一般来说,我们需要首先 Dissect 处理器,这是因为它的速度比 Grok 要快很多。Grok 是基于正则匹配,执行速度比 Dissect 要蛮很多。当然 Grok 也有自己的独到之处。它可以同时使用多个 patterns 来对日志来进行匹配。这个是 Dissect 不具备的能力。

下面,我们使用一些简单的例子来进行展示。

展示

我们可以使用 Dissect 处理器来对如下的日志来进行格式化。我们知道 Dissect 处理器对空格非常敏感。如果匹配不对,就会解析失败。

POST _ingest/pipeline/_simulate

  "pipeline": 
    "processors": [
      
        "dissect": 
          "field": "message",
          "pattern": "%@timestamp-> %status"
        
      
    ]
  ,
  "docs": [
    
      "_source": 
        "message": "2019-09-29 STATUS_OK"
      
    ,
    
      "_source": 
        "message": "2019-09-29       STATUS_OK"
      
    
  ]

在上面,尽管两个 message 的格式有所不同,但是我们使用了 -> 来避免错误的解析。上面命令显示的结果为:


  "docs" : [
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "@timestamp" : "2019-09-29",
          "message" : "2019-09-29 STATUS_OK",
          "status" : "STATUS_OK"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T01:29:27.141784Z"
        
      
    ,
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "@timestamp" : "2019-09-29",
          "message" : "2019-09-29       STATUS_OK",
          "status" : "STATUS_OK"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T01:29:27.14179Z"
        
      
    
  ]

上面的解析,我们也可以使用 Grok 处理器来进行解析:

POST _ingest/pipeline/_simulate

  "pipeline": 
    "processors": [
      
        "grok": 
          "field": "message",
          "patterns": [
            "%EVENTDATE:@timestamp %WORD:status"
          ],
          "pattern_definitions": 
            "EVENTDATE": "%YEAR-%MONTHNUM-%MONTHDAY"
          
        
      
    ]
  ,
  "docs": [
    
      "_source": 
        "message": "2019-09-29 STATUS_OK"
      
    
  ]

在上面,我们使用了定制的 pattern 来完成对 @timestamp 的解析。你可以进一步阅读 “Elastic:在 Grok 中运用 custom pattern 来定义 pattern”。上面运行的结果为:


  "docs" : [
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "@timestamp" : "2019-09-29",
          "message" : "2019-09-29 STATUS_OK",
          "status" : "STATUS_OK"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T01:31:22.028392Z"
        
      
    
  ]

就像我之前所说的,尽管 Dissect 和 Grok 都可以满足要求,我们首选 Dissect,毕竟它的效率要高很多。正则匹配是一个比较慢的运算。

在 Grok 使用多个 patterns 进行匹配

在上面,我们展示了 Dissect 和 Grok。在许多的情况下,它们都可以派上用场,但是有一种情况是 Grok 独有的。Grok 它可以同时使用多个 patterns 来对日志的文件进行匹配。比如,我们有如下的两种日志:


    "message": "55.3.244.1 OK"



    "message": "55.3.244.1 0.043"

 显然上面的两种日志的格式是完全不同的。第一种的情况是 IP 加上一个 status,而对于第二种情况来说说,它是 IP 加上一个浮点数。在这种情况下,我们使用 Dissect 是完全无能为力了。

我们可以使用 Grok 来完美地匹配这两种情况:

POST _ingest/pipeline/_simulate

  "pipeline": 
    "processors": [
      
        "grok": 
          "field": "message",
          "patterns": [
            "%IP:client %NUMBER:duration:float",
            "%IP:client %WORD:status"
          ]
        
      
    ]
  ,
  "docs": [
    
      "_source": 
        "message": "55.3.244.1 OK"
      
    ,
    
      "_source": 
        "message": "55.3.244.1 0.043"
      
    
  ]

在上面,我们在 Grok 的 pattern 里定义了如下的 patterns:

"patterns": [
    "%IP:client %NUMBER:duration:float",
    "%IP:client %WORD:status"
]

也就是说它可以同时匹配两个模式。其中的任何一个匹配,就可以完成文档的正确解析。运行上面的命令,我们可以看到如下的结果:


  "docs" : [
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 OK",
          "status" : "OK"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T01:39:44.282416Z"
        
      
    ,
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "duration" : 0.043,
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 0.043"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T01:39:44.282424Z"
        
      
    
  ]

从输出的结果中,我们可以清楚地看到结构化的输出。

我们甚至结合定制 pattern,让它生成更为复杂的匹配模式:

POST _ingest/pipeline/_simulate

  "pipeline": 
    "processors": [
      
        "grok": 
          "field": "message",
          "patterns": [
            "%IP:client %VERSION:version %NUMBER:num",
            "%IP:client %NUMBER:duration:float %NUMBER:num",
            "%IP:client %WORD:status %NUMBER:num"
          ],
          "pattern_definitions": 
            "VERSION": """\\d\\.\\d+\\.\\d"""
          
        
      
    ]
  ,
  "docs": [
    
      "_source": 
        "message": "55.3.244.1 7.31.1 12"
      
    ,
    
      "_source": 
        "message": "55.3.244.1 OK 14"
      
    ,
    
      "_source": 
        "message": "55.3.244.1 0.043 15"
      
    
  ]

在上面,我们运用 custom pattterns 来定制一个 pattern。它被用来匹配 version。上面运行的结果是:


  "docs" : [
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "num" : "12",
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 7.31.1 12",
          "version" : "7.31.1"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T02:21:22.447666Z"
        
      
    ,
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "num" : "14",
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 OK 14",
          "status" : "OK"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T02:21:22.447673Z"
        
      
    ,
    
      "doc" : 
        "_index" : "_index",
        "_type" : "_doc",
        "_id" : "_id",
        "_source" : 
          "duration" : 0.043,
          "num" : "15",
          "client" : "55.3.244.1",
          "message" : "55.3.244.1 0.043 15"
        ,
        "_ingest" : 
          "timestamp" : "2021-07-20T02:21:22.447676Z"
        
      
    
  ]

inilogstash配置使用编解码器多线解析scala/java日志,以将异常和堆栈跟踪消息连接到单个事件和gro中(代码片段)

查看详情

inilogstash配置使用编解码器多线解析scala/java日志,以将异常和堆栈跟踪消息连接到单个事件和gro中(代码片段)

查看详情

使用filebeat和awscloudwatchlogs将ec2上的tomcat的access_log传送到elasticsearch中并使用ilm完成日志的自动管理(代码片段)

文章目录使用dissectprocessor解构access_logoutput修改为Elasticsearch将日志设置为DataStream并启用索引生命周期周期管理ILM为什么要使用DataStream?为什么要使用ILM?日志数据配置ILM性能调优配置Filebat的内部队列大小如何验证queue.mem是合理且... 查看详情

ringbuffer

 http://ifeve.com/dissecting-disruptor-whats-so-special/正如名字所说的一样,它是一个环(首尾相接的环),你可以把它用做在不同上下文(线程)间传递数据的buffer。 如何使用Disruptor(二)如何从Ringbuffer读取http://ifeve.com/dissecting_... 查看详情

phpjavascript-pantallaenblancoynegro。(代码片段)

查看详情

filebeat、logstash过滤器实例

...0;https://www.elastic.co/guide/en/logstash/6.8/filter-plugins.html版本:elasticsearch-6.8.1、filebeat-6.8.0、logstash-6.8.0将如下日志数据,通过filebeat或者filebeat+logstash存入elasticsearch。说明:filebeat默认将每行日志信息读取到message字段中。   ... 查看详情

Elasticsearch 和 Hive 协同工作

】Elasticsearch和Hive协同工作【英文标题】:ElasticsearchandHiveworktogether【发布时间】:2014-08-3110:50:06【问题描述】:我发现Hive和Elasticsearch几乎是等价的,只是Elasticsearch支持近乎实时的查询。此外,Elasticsearch可以独立运行来存储和... 查看详情

elasticsearch入门——kibanna和postman操作elasticsearch索引示例(代码片段)

目录一、使用kibanna操作Elasticsearch索引示例二、使用postman操作Elasticsearch索引示例三、kibanna和postman操作Elasticsearch的总结一、使用kibanna操作Elasticsearch索引示例启动Elasticsearch和kibanna服务,浏览器访问http://localhost:5601/,进入DevToo... 查看详情

日志格式化(代码片段)

...安装,一般需要对日志文件进行日志格式化。SQL>selectgroup#,status,memberfromv$Logfile;+DATA/ORCL/ONLINELOG/group_3.284.979319979#alterdatabaseaddlogfilethread1group21(‘+DATA‘,‘+DATA‘)size512m;alterdatabaseaddlogfilethread1group22(‘+DATA‘,‘+DATA‘)size512m;alterdat... 查看详情

安装和使用elasticsearch

环境:  win764位   jdk1.8.0   elasticsearch2.3.3在官网下载elasticsearch2.3.3:https://www.elastic.co/thank-you?url=https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/ 查看详情

剖析elasticsearch集群系列第一篇elasticsearch的存储模型和读写操作

剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例。本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存储模型及CRUD(创建、读取、更新和删除)操作的工作原理。El... 查看详情

elasticsearch学习之elasticsearch的介绍和基本使用(代码片段)

Elasticsearch一)ES的基本介绍1.Elasticsearch是什么2.Eelasticsearch的作用3.Elasticsearch,Solr和Lucene三者之间的关系4.Elasticsearch的索引结构--倒排索引5.ES中的一些基本概念二)ES索引的增删改查1.mapping映射属性2.索引库的创建3.查... 查看详情

elasticsearch学习之elasticsearch的介绍和基本使用(代码片段)

Elasticsearch一)ES的基本介绍1.Elasticsearch是什么2.Eelasticsearch的作用3.Elasticsearch,Solr和Lucene三者之间的关系4.Elasticsearch的索引结构--倒排索引5.ES中的一些基本概念二)ES索引的增删改查1.mapping映射属性2.索引库的创建3.查... 查看详情

elasticsearch和solr的差别

Elasticsearch简介Elasticsearch是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。它用于全文搜索、结构化搜索、分析以及将这三者混合使用:维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及... 查看详情

Elasticsearch 和后续的 Mongodb 查询

】Elasticsearch和后续的Mongodb查询【英文标题】:ElasticsearchandsubsequentMongodbqueries【发布时间】:2016-07-1506:51:39【问题描述】:我正在使用Elasticsearch实现搜索功能。我收到Elasticsearch返回的“用户名”集,之后我需要在MongoDB中查询一... 查看详情

Debezium Postgres 和 ElasticSearch - 在 ElasticSearch 中存储复杂对象

】DebeziumPostgres和ElasticSearch-在ElasticSearch中存储复杂对象【英文标题】:DebeziumPostgresandElasticSearch-StorecomplexObjectinElasticSearch【发布时间】:2020-12-2923:50:11【问题描述】:我在Postgres中有一个带有表“product”的数据库,该表通过“sa... 查看详情

elasticsearch和数据库保持同步的方式及原理

参考技术A上一篇<<<Linux环境安装Elasticsearch集群下一篇>>>Logstash-input-jdbc实现ES和数据同步操作步骤推荐阅读:<<<Elasticsearch入门知识<<<Elasticsearch快速原因分析及应用场景<<<Elasticsearch的存储结构端... 查看详情

elasticsearch学习笔记——安装和数据导入

到elasticsearch网站下载最新版本的elasticsearch6.2.1https://www.elastic.co/downloads/elasticsearch下载tar包,然后解压到/usr/local目录下,修改一下用户和组之后可以使用非root用户启动,启动命令./bin/elasticsearch然后访问http://127.0.0.1:9200/接下来导... 查看详情