Elasticsearch:使用 Elasticsearch categorize_text 聚合对日志进行分类

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:使用 Elasticsearch categorize_text 聚合对日志进行分类相关的知识,希望对你有一定的参考价值。

作者:Benjamin Trent

作为一名前系统管理员,我个人对 categorize_text 对探索日志的意义感到兴奋。 这种新的 Elasticsearch 功能是我希望在那些日子里拥有的东西。 花费大量时间筛选大量日志以找出令人不安的模式。 categorize_text 在查询时将流行的日志模式带到最前沿。 此功能与 Elasticsearch 已经广泛且强大的聚合框架相结合,可缩短获取信息的时间。 探索成山的日志变得更加容易。 在 Kibana 中自动集群日志、计算统计数据和可视化是任何 SRE 或管理员的有力工具。

categorize_text 聚合是如何工作?

categorize_text 从文档 _source 读取文本并使用自定义 tokenizer ml_standard 创建 tokenizer,该 tokenizer 专门为一般机器生成的文本构建。 事实上,异常检测中提供的许多相同选项在 categorize_text 中可用。 分析文本后,将使用 DRAIN 算法的修改版本将 token 聚集在一起。 DRAIN 构建一个 token 树并认为较早的 token 更重要。 我们稍微修改了算法,以允许在构建类别时合并文本中较早的token。 本质上,具有高可变性的 token 被删除,而更一致的 token 形成类别定义。

文本分类示例

以下是 categorize_text 解析以下 nginx 日志行的方式。

"message": "2018/11/26 18:09:45 [error] 8#8: *4781 open() \\"/etc/nginx/html/wan.php\\" failed (2: No such file or directory), client: 154.91.201.90, server: _, request: \\"POST /wan.php HTTP/1.1\\", host: \\"35.246.148.213\\"",
"message": "2018/11/20 17:26:36 [error] 8#8: *3672 open() \\"/etc/nginx/html/pe.php\\" failed (2: No such file or directory), client: 139.159.210.222, server: _, request: \\"POST /pe.php HTTP/1.1\\", host: \\"35.246.148.213\\""

使用默认设置,它将成为以下类别:

error open * failed No such file or directory client server request * host

公共 token 包含在类别定义中,变量 token(在这种情况下为 url 文件路径)用 * 值省略。

既然我们知道它在高层次上是如何工作的,那么它怎么能被使用呢?

可视化日志类别的示例

让我们研究 categorize_text 聚合的三个用例,它们可以帮助你作为系统管理员:随时间按类别识别问题、显示最常见的错误类别和类别趋势可视化。 以下示例均使用 Kibana Vega 在查询时可视化日志类别。

比较不同日期的顶级类别

以下示例显示了两天内 NGINX 错误的不同顶级类别。 在将之前已知的 “好日子” 与系统行为不稳定的日子进行比较时,这很有用。


  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "title": "Text categories between two days",
  "data": 
    "url": 
      "index": "filebeat-*",
      "body": 
        "size": 0,
        "query": 
          "bool": 
            "filter": [
              "term": "event.dataset": "nginx.error",
              
                "bool": 
                  "should": [
                    
                      "range": 
                        "@timestamp": 
                          "gte": "2021-02-25T00:00:00.000Z",
                          "lte": "2021-02-25T12:00:00.000Z"
                        
                      
                    ,
                    
                      "range": 
                        "@timestamp": 
                          "gte": "2021-02-26T00:00:00.000Z",
                          "lte": "2021-02-26T12:00:00.000Z"
                        
                      
                    
                  ],
                  "minimum_should_match": 1
                
              
            ]
          
        ,
        "aggs": 
          "sample": 
            "sampler": "shard_size": 5000,
            "aggs": 
              "categories": 
                "categorize_text": 
                  "field": "message",
                  "similarity_threshold": 20,
                  "max_unique_tokens": 20
                ,
                "aggs": 
                  "time_buckets": 
                    "filters": 
                      "filters": 
                        "first": 
                          "range": 
                            "@timestamp": 
                              "gte": "2021-02-25T00:00:00.000Z",
                              "lte": "2021-02-25T12:00:00.000Z"
                            
                          
                        ,
                        "second": 
                          "range": 
                            "@timestamp": 
                              "gte": "2021-02-26T00:00:00.000Z",
                              "lte": "2021-02-26T12:00:00.000Z"
                            
                          
                        
                      
                    
                  
                
              
            
          
        
      
    ,
    "format": "property": "aggregations.sample.categories.buckets"
  ,
  "transform": [
    
      "fold": [
        "time_buckets.buckets.first.doc_count",
        "time_buckets.buckets.second.doc_count"
      ],
      "as": ["subKey", "subValue"]
    
  ],
  "mark": "bar",
  "encoding": 
    "x": "field": "subKey", "type": "ordinal", "axis": "title": null,
    "y": 
      "field": "subValue",
      "type": "quantitative",
      "axis": "title": "Document count"
    ,
    "color": "field": "key",
    "tooltip": [
      "field": "key", "type": "nominal", "title": "category",
      "field": "subValue", "type": "quantitative", "title": "Count"
    ]
  ,
  "layer": ["mark": "bar", "encoding": "color": "field": "key"]

如果你对如何使用 Vega 来进行可视化还不是很了解的话,请参阅文章 “Kibana:Vega 可视化入门 - 定制自己的可视化图”。

通过术语聚合收集顶级类别

此术语聚合示例显示了每个类别中哪些术语值最普遍。 在这种特殊情况下,

Kubernetes pod 是使用的术语。


  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "title": "Event counts from all indexes",
  "data": 
    "url": 
      "%context%": true,
      "%timefield%": "@timestamp",
      "index": "filebeat-8.0.0-*",
      "body": 
        "aggs": 
          "sample": 
            "sampler": "shard_size": 5000,
            "aggs": 
              "categories": 
                "categorize_text": 
                  "field": "message",
                  "similarity_threshold": 20,
                  "max_unique_tokens": 20
                ,
                "aggs": 
                  "k8_pod": 
                    "terms": "field": "kubernetes.pod.name", "size": 5
                  
                
              
            
          
        ,
        "size": 0
      
    ,
    "format": "property": "aggregations.sample.categories.buckets"
  ,
  "transform": [
    "flatten": ["k8_pod.buckets"], "as": ["k8_pod_buckets"]
  ],
  "mark": "bar",
  "encoding": 
    "x": "field": "key", "type": "ordinal", "axis": "title": false,
    "y": 
      "field": "doc_count",
      "type": "quantitative",
      "axis": "title": "Document count"
    ,
    "color": "field": "k8_pod_buckets.key",
    "tooltip": [
      "field": "k8_pod_buckets",
      "type": "nominal",
      "title": "category"
    , 
      "field": "k8_pod_buckets.doc_count",
      "type": "quantitative",
      "title": "Count"
    ]
  

随着时间的推移可视化类别趋势

此分析可用于探索奇怪的日志记录峰值,并帮助确定哪些类别对峰值的贡献最大。


  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "title": "top categories every 15m",
  "data": 
    "url": 
      "%context%": true,
      "%timefield%": "@timestamp",
      "index": "filebeat-8.0.0-*",
      "body": 
        "aggs": 
          "categories": 
            "categorize_text": 
              "field": "message",
              "similarity_threshold": 20,
              "max_unique_tokens": 20
            ,
            "aggs": 
              "time_buckets": 
                "date_histogram": 
                  "field": "@timestamp",
                  "interval": "15m",
                  "min_doc_count": 1
                
              
            
          
        ,
        "size": 0
      
    ,
    "format": "property": "aggregations.categories.buckets"
  ,
  "transform": ["flatten": ["time_buckets.buckets"], "as": ["buckets"]],
  "mark": "area",
  "encoding": 
    "tooltip": [
      "field": "buckets.key", "type": "temporal", "title": "Date",
      "field": "key", "type": "nominal", "title": "Category",
      "field": "buckets.doc_count", "type": "quantitative", "title": "Count"
    ],
    "x": "field": "buckets.key", "type": "temporal", "axis": "title": "category",
    "y": 
      "field": "buckets.doc_count",
      "type": "quantitative",
      "stack": true,
      "axis": "title": "Document count"
    ,
    "color": "field": "key", "type": "nominal"
  ,
  "layer": [
    "mark": "area",
    
      "mark": "point",
      "selection": 
        "pointhover": 
          "type": "single",
          "on": "mouseover",
          "clear": "mouseout",
          "empty": "none",
          "fields": ["buckets.key", "key"],
          "nearest": true
        
      ,
      "encoding": 
        "size": 
          "condition": "selection": "pointhover", "value": 100,
          "value": 5
        ,
        "fill": "condition": "selection": "pointhover", "value": "white"
      
    
  ]

试试看

这些示例只是 7.16 技术预览版中发布的 categorize_text 聚合的开始。 对机器生成的文本进行分类和 Elasticsearch 中强大的聚合框架为你提供了大量的日志和数据探索机会。 立即启动 Elastic Cloud 集群并试一试。 我们很想听听你的反馈——在我们的讨论论坛社区 Slack 频道中加入有关 Elastic 机器学习的对话。

 更多阅读:Elasticsearch:使用 categorize text aggregation 来创建更好的警报

以上是关于Elasticsearch:使用 Elasticsearch categorize_text 聚合对日志进行分类的主要内容,如果未能解决你的问题,请参考以下文章

spring整合Elasticsearch

ElasticSearch 基本使用

ElasticSearch:分析器

ElasticSearch安装与启动

EnableReactiveMongoRepositories和ElasticSearch

Elasticsearch 和 Hive 协同工作