• ELK日志分析 学习笔记


    (贴一篇之前工作期间整理的elk学习笔记)

    ELK官网 https://www.elastic.co

     

    ELK日志分析系统 学习笔记

    概念:ELK = elasticsearch + logstash + kibana

    编程语言分别是 Java、JRuby、Ruby
    概括的说,logstash 采集和结构化日志,输入elasticsearch创建索引,kibana查询elasticsearch这个搜索引擎 来完成数据的分析展示。
    ELK 介绍:https://yq.aliyun.com/articles/73622
     
     

    elasticsearch 基本概念,原理

    详见:http://www.cnblogs.com/valor-xh/p/6095894.html

    基本概念

    索引(Index)

    ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。

    举例说:pandora的所有日志可以存放于一个索引之中。

    索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。

    类型(Type)

    类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。

    举例说:pandora这个索引的type可以只有一个:pandoralog, 也可根据pandora的模块 分成多个type, 比如 登陆、部署、配置...

    例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。

    文档(Document)

    文档是Lucene索引和搜索的原子单位,基于JSON格式进行表示。 一个文档就是一个保存在 es 中的 JSON 文本,可以把它理解为关系型数据库表中的一行。每个文档都是保存在索引中的,拥有一种type和 id。

    id

    Id 是用于标识文档的,一个文档的索引/类型/id 必须是唯一的。文档 id 是自动生成的(如果不指定)。

    field 字段

    一个文档包含了若干字段,或称之为键值对。字段的值可以是简单(标量)值(例如字符串、整型、日期),也可以是嵌套结构,例如数组或对象。一个字段类似于关系型数据库表中的一列。每个字段的映射都有一个字段类型(不要和文档类型搞混了),它描述了这个字段可以保存的值类型,例如整型、字符串、对象。映射还可以让我们定义一个字段的值如何进行分析。

    映射(Mapping)

    ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。

    另外,ES还提供了额外功能,例如将域中的内容按需排序。事实上,ES也能自动根据其值确定域的类型。

    总结来说, mapping的作用就是执行一系列的指令将输入的数据转成可搜索的索引项。

    详见http://blog.csdn.net/lvhong84/article/details/23936697

    接下去再说说ES Cluster相关的一些概念。

    集群(Cluster)

    ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。

    多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。

    集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。

    如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。

    节点(Node)

    运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。

    类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。

    用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。

    节点通过为其配置的ES集群名称确定其所要加入的集群。

    分片(Shard)和副本(Replica)

    ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。

    每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。

    Shard有两种类型:primary和replica,即主shard及副本shard。

    Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。

    Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。

    每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。

    ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。

    ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。

     

    简单的一个演示 加深对 index、doucument、type、id 的理解:

    10.6.129.101:9200已搭建  通过restApi 与es交互

    几个很常用的接口:

    /_cat 查看可用命令 

    /_cat/nodes?v:查集群状态
     
    /_cat/health?v :查询集群健康状态
     
    /_cat/shards?v:查看分片状态
     
    /${index}/${type}/_search?pretty:搜索
    /${index}/_search?pretty&q=xxx=xxx :带条件搜索
    /_search?pretty :查询全部文档 /_count?pretty

    (uri后面加?v 表示 对查询结果按类型分列展示;?pretty 表示对结果格式化输出)

    查看es 可用索引http://10.6.129.101:9200/_cat/indices?v

    索引雇员文档

    • 每个雇员索引一个文档,包含该雇员的所有信息。
    • 每个文档都将是 employee 类型 。 type
    • 该类型位于 索引 megacorp 内。 index
    • 该索引保存在我们的 Elasticsearch 集群中。

    实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作:

    (拷贝下列代码 到kibana DevTools模块 中运行 是一个很方便的方法)

    PUT /megacorp/employee/1

    {

        "first_name" : "John",

        "last_name" :  "Smith",

        "age" :        25,

        "about" :      "I love to go rock climbing",

        "interests": [ "sports", "music" ]

    }

     

    注意,路径 /megacorp/employee/1 包含了三部分的信息:

    megacorp

    索引名称

    employee

    类型名称

    1

    特定雇员的ID

     

    接着 再写入两条

     

    PUT /megacorp/employee/2
    {
        "first_name" :  "Jane",
        "last_name" :   "Smith",
        "age" :         32,
        "about" :       "I like to collect rock albums",
        "interests":  [ "music" ]
    }
     
    PUT /megacorp/employee/3
    {
        "first_name" :  "Douglas",
        "last_name" :   "Fir",
        "age" :         35,
        "about":        "I like to build cabinets",
        "interests":  [ "forestry" ]
    }

    查询es所有索引http://10.6.129.101:9200/_cat/indices?v  可以看到 新创建的megacorp 索引

    检索文档

    目前我们已经在 Elasticsearch 中存储了一些数据, 接下来就能专注于实现应用的业务需求了。

    1)第一个需求是可以检索到单个雇员的数据。

    GET /megacorp/employee/1
     
    将 HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 

    2)我们使用下列请求来搜索所有雇员

    GET /megacorp/employee/_search
     
    3)接下来,尝试下搜索姓氏为 ``Smith`` 的雇员。为此,我们将使用一个 高亮 搜索,很容易通过命令行完成。这个方法一般涉及到一个 查询字符串 (_query-string_) 搜索
    GET /megacorp/employee/_search?q=last_name:Smith
     
    我们仍然在请求路径中使用 _search 端点,并将查询本身赋值给参数 q= 。返回结果给出了所有的 Smith
     

    4)Query-string 搜索通过命令非常方便地进行临时性的即席搜索 ,但它有自身的局限性(参见 轻量 搜索)。Elasticsearch 提供一个丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。

    领域特定语言 (DSL), 指定了使用一个 JSON 请求。我们可以像这样重写之前的查询所有 Smith 的搜索 :

    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "last_name" : "Smith"
            }
        }
    }
    这个请求使用 JSON 构造,并使用了一个 match 查询
     

    5)更复杂的搜索

    现在尝试下更复杂的搜索。 同样搜索姓氏为 Smith 的雇员,但这次我们只需要年龄大于 30 的。查询需要稍作调整,使用过滤器 filter ,它支持高效地执行一个结构化查询。

    GET /megacorp/employee/_search
    {
        "query" : {
            "bool": {
                "must": {
                    "match" : {
                        "last_name" : "smith" 
                    }
                },
                "filter": {
                    "range" : {
                        "age" : { "gt" : 30 } 
                    }
                }
            }
        }
    }
     

    这部分与我们之前使用的 match 查询 一样。

     

    这部分是一个 range 过滤器 , 它能找到年龄大于 30 的文档,其中 gt 表示_大于(_great than)。

    目前无需太多担心语法问题,后续会更详细地介绍。只需明确我们添加了一个 过滤器 用于执行一个范围查询,并复用之前的 match 查询。现在结果只返回了一个雇员,叫 Jane Smith,32 岁。

    6)全文搜索

    截止目前的搜索相对都很简单:单个姓名,通过年龄过滤。现在尝试下稍微高级点儿的全文搜索——一项传统数据库确实很难搞定的任务。

    搜索下所有喜欢攀岩(rock climbing)的雇员:

    GET /megacorp/employee/_search
    {
        "query" : {
            "match" : {
                "about" : "rock climbing"
            }
        }
    }

    显然我们依旧使用之前的 match 查询在about 属性上搜索 “rock climbing” 。得到两个匹配的文档:

    {
       ...
       "hits": {
          "total":      2,
          "max_score":  0.16273327,
          "hits": [
             {
                ...
                "_score":         0.16273327, 
                "_source": {
                   "first_name":  "John",
                   "last_name":   "Smith",
                   "age":         25,
                   "about":       "I love to go rock climbing",
                   "interests": [ "sports", "music" ]
                }
             },
             {
                ...
                "_score":         0.016878016, 
                "_source": {
                   "first_name":  "Jane",
                   "last_name":   "Smith",
                   "age":         32,
                   "about":       "I like to collect rock albums",
                   "interests": [ "music" ]
                }
             }
          ]
       }
    }

    相关性得分

    Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。第一个最高得分的结果很明显:John Smith 的 about 属性清楚地写着 “rock climbing” 。

    但为什么 Jane Smith 也作为结果返回了呢?原因是她的 about 属性里提到了 “rock” 。因为只有 “rock” 而没有 “climbing” ,所以她的相关性得分低于 John 的。

    这是一个很好的案例,阐明了 Elasticsearch 如何  全文属性上搜索并返回相关性最强的结果。Elasticsearch中的 相关性 概念非常重要,也是完全区别于传统关系型数据库的一个概念,数据库中的一条记录要么匹配要么不匹配。

    7)短语搜索

    找出一个属性中的独立单词是没有问题的,但有时候想要精确匹配一系列单词或者短语 。 比如, 我们想执行这样一个查询,仅匹配同时包含 “rock”  “climbing” ,并且 二者以短语 “rock climbing” 的形式紧挨着的雇员记录。

    为此对 match 查询稍作调整,使用一个叫做 match_phrase 的查询:

    GET /megacorp/employee/_search
    {
        "query" : {
            "match_phrase" : {
                "about" : "rock climbing"
            }
        }
    }

    8)高亮搜索

    许多应用都倾向于在每个搜索结果中 高亮 部分文本片段,以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。

    再次执行前面的查询,并增加一个新的 highlight 参数:

    GET /megacorp/employee/_search
    {
        "query" : {
            "match_phrase" : {
                "about" : "rock climbing"
            }
        },
        "highlight": {
            "fields" : {
                "about" : {}
            }
        }
    }
     

    当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:

    9)分析聚合

    终于到了最后一个业务需求:支持管理者对雇员目录做分析。 Elasticsearch 有一个功能叫聚合(aggregations,允许我们基于数据生成一些精细的分析结果。聚合与 SQL 中的 GROUP BY 类似但更强大。

    举个例子,挖掘出雇员中最受欢迎的兴趣爱好:

    先开启

    PUT megacorp/_mapping/employee/
    {
      "properties": {
        "interests": { 
          "type":     "text",
          "fielddata": true
        }
      }
    }

    执行

    GET /megacorp/employee/_search
    {
      "aggs": {
        "all_interests": {
          "terms": { "field": "interests" }
        }
      }
    }

     

    暂时忽略掉语法,直接看看结果:

    {
       ...
       "hits": { ... },
       "aggregations": {
          "all_interests": {
             "buckets": [
                {
                   "key":       "music",
                   "doc_count": 2
                },
                {
                   "key":       "forestry",
                   "doc_count": 1
                },
                {
                   "key":       "sports",
                   "doc_count": 1
                }
             ]
          }
       }
    }

    可以看到,两位员工对音乐感兴趣,一位对林地感兴趣,一位对运动感兴趣。这些聚合并非预先统计,而是从匹配当前查询的文档中即时生成。如果想知道叫 Smith 的雇员中最受欢迎的兴趣爱好,可以直接添加适当的查询来组合查询:

    GET /megacorp/employee/_search
    {
      "query": {
        "match": {
          "last_name": "smith"
        }
      },
      "aggs": {
        "all_interests": {
          "terms": {
            "field": "interests"
          }
        }
      }
    }

    all_interests 聚合已经变为只包含匹配查询的文档:

      ...
      "all_interests": {
         "buckets": [
            {
               "key": "music",
               "doc_count": 2
            },
            {
               "key": "sports",
               "doc_count": 1
            }
         ]
      }

    聚合还支持分级汇总 。比如,查询特定兴趣爱好员工的平均年龄:

    GET /megacorp/employee/_search
    {
        "aggs" : {
            "all_interests" : {
                "terms" : { "field" : "interests" },
                "aggs" : {
                    "avg_age" : {
                        "avg" : { "field" : "age" }
                    }
                }
            }
        }
    }

    得到的聚合结果有点儿复杂,但理解起来还是很简单的:

      ...
      "all_interests": {
         "buckets": [
            {
               "key": "music",
               "doc_count": 2,
               "avg_age": {
                  "value": 28.5
               }
            },
            {
               "key": "forestry",
               "doc_count": 1,
               "avg_age": {
                  "value": 35
               }
            },
            {
               "key": "sports",
               "doc_count": 1,
               "avg_age": {
                  "value": 25
               }
            }
         ]
      }

    输出基本是第一次聚合的加强版。依然有一个兴趣及数量的列表,只不过每个兴趣都有了一个附加的 avg_age 属性,代表有这个兴趣爱好的所有员工的平均年龄。

    即使现在不太理解这些语法也没有关系,依然很容易了解到复杂聚合及分组通过 Elasticsearch 特性实现得很完美。可提取的数据类型毫无限制。

    教程结语

    这是一个关于 Elasticsearch 基础描述的教程,且仅仅是浅尝辄止,更多诸如 suggestions、geolocation、percolation、fuzzy 与 partial matching 等特性均被省略,以便保持教程的简洁。但它确实突显了开始构建高级搜索功能多么容易。不需要配置——只需要添加数据并开始搜索!

    删除索引

    DELETE    megacorp

    其他的一些操作命令

    按时间查询日志(国际时间)

    Try a test query to Elasticsearch based on the fields created by the grok filter plugin. Replace $DATE with the current date, in YYYY.MM.DD format:

    curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'
    例如 http://10.6.129.101:9200/logstash-2017.08.12/_search?pretty&q=host=10.33.42.212
    其中 host=xxx可替换为host:xxx

    按城市名称查询

    curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=geoip.city_name=Buffalo'
     

    Logstash 介绍

    Logstash 是一款强大的数据处理工具,它可以实现数据传输,格式处理,格式化输出,还有强大的插件功能,常用于日志处理(运行环境jvm 8)

    官网地址:https://www.elastic.co/products/logstash

    官方文档:https://www.elastic.co/guide/en/logstash
     
    Logstash管道有两个必需的元素,input output,以及一个可选的元素,filter。输入插件消费源数据,过滤器插件会按照你指定的方式修改数据,输出插件将数据写入到目的地(查看logstash安装了哪些插件./bin/logstash-plugin list)。配置模板
    input {{
    }}
     
    filter { filter {
     
    }}
    output {{
    }}
     
    示例 参见虚拟机10.6.129.101配置示例。

    工作流程

     

    Logstash 工作的三个阶段:

    input 数据输入端,可以接收来自任何地方的源数据。

    • file:从文件中读取
    • syslog:监听在514端口的系统日志信息,并解析成RFC3164格式。
    • redis:从redis-server list 中获取
    • beat:接收来自Filebeat的事件

    Filter 数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加,修改等,常用的过滤器如下。

    • grok: 通过正则解析和结构化任何文本。Grok 目前是logstash最好的方式对非结构化日志数据解析成结构化和可查询化。logstash内置了120个匹配模式,满足大部分需求。
    • mutate: 在事件字段执行一般的转换。可以重命名、删除、替换和修改事件字段。
    • drop: 完全丢弃事件,如debug事件。
    • clone: 复制事件,可能添加或者删除字段。
    • geoip: 添加有关IP地址地理位置信息。

    output 是logstash工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:

    • elasticsearch: 发送事件数据到 Elasticsearch,便于查询,分析,绘图。
    • file: 将事件数据写入到磁盘文件上。
    • mongodb:将事件数据发送至高性能NoSQL mongodb,便于永久存储,查询,分析,大数据分片。
    • redis:将数据发送至redis-server,常用于中间层暂时缓存。
    • graphite: 发送事件数据到graphite,用于存储和绘制指标的流行开源工具。http://graphite.wikidot.com/
    • statsd: 发送事件数据到 statsd。

    Codecs编解码器

    编解码器可以作为输入的流过滤器。编解码器使您可以轻松地将邮件的传输与序列化过程分开。流行的编解码器包括jsonmsgpackplain (文本)。

     

    简单的两种测试输入输出的配置

    测试您的Logstash,运行最基本的Logstash管道。

    1)例如:shell标准输入数据

    cd logstash-5.5.1 
    bin / logstash -e'input {stdin {}} output {stdout {}}'
     
    2)或 端口输入,stdout输出
    input {
        beats {
            port => "5043"
        }
    }
    output {
        stdout { codec => rubydebug }
    }
     

    验证配置文件是否正确 和配置自动加载

    bin/logstash -f first-pipeline.conf --config.test_and_exit
     
    bin/logstash -f first-pipeline.conf --config.reload.automatic

    --config.reload.automatic选项启用自动配置重新加载,以便您每次修改配置文件时不必停止并重新启动Logstash。

     

    Grok 结构化数据

    过滤器插件使您能够将非结构化日志数据进行结构化  参见演示平台logstash 配置

    filter {
        grok {
            match => { "message" => "%{COMBINEDAPACHELOG}"}
        }
    }

     

     

    删除注册文件,让filebeat 重新读取日志

    sudo rm data/registry

     

    geoip  补充ip信息  需下载geoip数据库,或机器能连网

    filter {
        grok {
            match => { "message" => "%{COMBINEDAPACHELOG}"}
        }
        geoip {
            source => "clientip"
        }
    }
     
    logstash配置文件基础语法:
    https://www.elastic.co/guide/en/logstash/5.5/event-dependent-configuration.html
     

    Grok 使用语法

     

    https://www.elastic.co/guide/en/logstash/5.5/plugins-filters-grok.html

    解析任意文本和结构。

    Grok目前是logstash中将最坏的非结构化日志数据解析为结构化和可查询的最佳方式。

    此工具非常适用于syslog日志,apache和其他Web服务器日志,mysql日志以及通常为人类而不是计算机消费而编写的任何日志格式。

    默认情况下,Logstash约有120种模式。你可以在这里找到他们:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns。你可以自己加入。(见patterns_dir设定)

    如果您需要帮助构建模式以匹配您的日志,您会发现 http://grokdebug.herokuapp.comhttp://grokconstructor.appspot.com/应用程序非常有用!

    基本演示: 访问http://grokdebug.herokuapp.com/

    日志:

    55.3.244.1 GET /index.xml 15824 0.043

    pattern:

    %{IPV4:client} %{WORD:method} %{URIPATH:uri} %{INT:datalength} %{BASE16FLOAT:timecost}

    输出:

    写成配置:

    input {

      file {

        path => "/var/log/http.log"

      }

    }

    filter {

      grok {

    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }

    remove_field => [ "message" ]

     

      }

    }

    filebeat 配置 fields type

    • multiline:将多行文本事件(如java异常和堆栈跟踪)消息合并到一个事件中。
    filebeat.prospectors:
    - input_type: log
      paths:
        - /var/log/*.log 
      fields:
        type: syslog 
    output.logstash:
      hosts: ["localhost:5043"]
     
     
    logstash 配置 input tritter ,out put file,其中output:elasticsearch 可以填写集群多个节点,自动负载均衡。端口可以不填,默认9200
     
    input {
        twitter {
            consumer_key => "enter_your_consumer_key_here"
            consumer_secret => "enter_your_secret_here"
            keywords => ["cloud"]
            oauth_token => "enter_your_access_token_here"
            oauth_token_secret => "enter_your_access_token_secret_here"
        }
        beats {
            port => "5043"
    }

    file {

        path => “/var/log/ apache/ access.log”

        type => “apache” }

     
    }
    output {
        elasticsearch {
            hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
        }
        file {
            path => "/path/to/target/file"
        }
    }
     
    elsaticsearch 查询 上面配置的filed type :
    curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=fields.type:syslog'
     
    查询推特信息
    curl -XGET 'http://localhost:9200/logstash-$DATE/_search?pretty&q=client:iphone'
     
     
     
     

    后台运行logstash

    logstash 启停 /etc/init.d/logstash start
    # 通过这种方式启动,logstash会自动加载 /etc/logstash/conf.d/ 下的配置文件
     

    或后台命令行运行:

    nohup /usr/share/logstash/bin/logstash -f /usr/share/logstash/bin/logstash.conf  &>/dev/null &

     

     

    哈希

    哈希是以格式指定的键值对的集合"field1" => "value1"。请注意,多个键值条目由空格分隔,而不是逗号。

    例:

    match => { “field1” => “value1” “field2” => “value2” ... } 
        
        
     
     
    output  -elasticsearch
    https://www.elastic.co/guide/en/logstash/5.5/plugins-outputs-elasticsearch.html
     

    index

    • 值类型是字符串
    • 默认值为 "logstash-%{+YYYY.MM.dd}"
    • 值类型是字符串
    • 此设置没有默认值。
     

    id

    添加一个独特ID的插件配置。如果没有指定ID,Logstash将生成一个。强烈建议您在配置中设置此ID。当您有两个或多个相同类型的插件时,例如,如果您有2个Grok过滤器,则此功能特别有用。在这种情况下添加命名ID将有助于在使用监视API时监视Logstash。

    输出{
     stdout {
       id =>“my_plugin_id”
     }
    }
     
      

     

     

    nginx 实战 比较全面的一个示例

     
    参考文档http://tchuairen.blog.51cto.com/3848118/1840596/
     

    1)注意事项:

    其中nginx 日志改json 格式的方法: 在http 域内 定义名为json的log_format 格式,然后指定日志文件access.log使用该格式:
    access_log  logs/access.log  json;
     
    最后重新加载,或重启nginx 以生效
     
    如下:
     
    http {
        log_format json '{"@timestamp":"$time_iso8601",'
                     '"slbip":"$remote_addr",'
                     '"clientip":"$http_x_forwarded_for",'
                     '"serverip":"$server_addr",'
                     '"size":$body_bytes_sent,'
                     '"responsetime":$request_time,'
                     '"domain":"$host",'
                     '"method":"$request_method",'
                     '"requesturi":"$request_uri",'
                     '"url":"$uri",'
                     '"appversion":"$HTTP_APP_VERSION",'
                     '"referer":"$http_referer",'
                     '"agent":"$http_user_agent",'
                     '"status":"$status"}';
     
    access_log  logs/access.log  json;
     
     
    - input_type: log
      paths:
        - /usr/local/openresty/nginx/logs/access.log
      fields:
        type: nginxacclog
      fields_under_root: true

    2)grok匹配pandora 日志 示例:

    .2017-08-13 12:42:25.112 MsgProcessThread-4 org.springframework.web.servlet.mvc.method INFO - ping from [/10.33.25.215:41542]

    %{TIMESTAMP_ISO8601:time} %{USERNAME :thread} %{USERNAME:classpath} %{LOGLEVEL:loglevel} - %{GREEDYDATA:data}

    logstash if else 语法

    if EXPRESSION {

      ...

    } else if EXPRESSION {

      ...

    } else {

      ...

    }

    kibana 基本操作

     

    Discover  对日志进行检索查看

    Visuallize  图表可视化 配置;对特定规则聚合的数据进行图表分析

    Dashboard  将Visualize设置的图表展示成仪表盘,有分组功能

    Timelion   默认显示的.es(*) 为 es 文档个数

    Dev Tools  一个RestAPI Console  与elasticsearch 进行交互

    Management  创建管理索引的地方  以及 其他 的高级设置

  • 相关阅读:
    2019-9-2-正则表达式30分钟入门教程
    2019-6-23-开源项目使用-appveyor-自动构建
    2019-8-29-dotnet-core-使用-sqlite-部署到-Centos-服务器
    2018-10-19-Roslyn-使用-Directory.Build.props-文件定义编译
    2019-4-29-dotnet-通过-WMI-获取系统安装软件
    2018-12-24-win10-uwp-求两个矩形相连的几何
    shell公共函数functions
    linux防火墙和SELinux
    ubuntu开启ssh
    文件夹操作
  • 原文地址:https://www.cnblogs.com/wangzhen-fly/p/11082019.html
Copyright © 2020-2023  润新知